Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sqlite获取图片花费的时间太长_C#_Sqlite_Image - Fatal编程技术网

C# Sqlite获取图片花费的时间太长

C# Sqlite获取图片花费的时间太长,c#,sqlite,image,C#,Sqlite,Image,我有几个大的DB文件(每个大约50GB),其中包含客户文档的图像(每个图片大小约300KB) 我正试图将图片加载到我的查看器中,但它花费的时间太长,比如1分钟。专门用于第一次查询/记录 string query = "select pic from tbl_pictures where record_id = '" + SearchID + "'"; SQLiteConnection con = new SQLiteConnection(conString);

我有几个大的DB文件(每个大约50GB),其中包含客户文档的图像(每个图片大小约300KB)

我正试图将图片加载到我的查看器中,但它花费的时间太长,比如1分钟。专门用于第一次查询/记录

string query = "select pic from tbl_pictures where record_id = '" + SearchID + "'";

            SQLiteConnection con = new SQLiteConnection(conString);
            SQLiteCommand cmd = new SQLiteCommand(query, con);
            con.Open();
            try
            {
                IDataReader rdr = cmd.ExecuteReader();
                try
                {
                    ListOfImagesBytes.Clear();
                    while (rdr.Read())
                    {
                        byte[] a = (System.Byte[])rdr[0];
                        ListOfImagesBytes.Add((System.Byte[])rdr[0]);


                    }
                }
                catch (Exception exc) { MessageBox.Show(exc.Message); }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            con.Close();
下面是我创建DB文件时的属性:

PRAGMA auto_vacuum = 1;
PRAGMA main.page_size = 4096;
PRAGMA main.locking_mode=NORMAL;
PRAGMA main.synchronous=NORMAL;
PRAGMA main.journal_mode=WAL;
PRAGMA main.cache_size=5000;
PRAGMA main.temp_store=Memory;

您可能只是在访问表深处的一条记录,而没有索引来提供帮助。也许可以添加一个索引

CREATE INDEX record_id_index ON tbl_pictures(record_id);

数据库上的页面大小为8k或16k可能更好——SQLite的家伙有一个关于blob和性能的页面;然而,它似乎表明100kB以下的文件是可以使用的。比100kB大得多,您的性能会受到影响。

您应该记住SQLite是基于文件的,所以第一次查询很可能需要更长的时间,因为很多内容都加载到内存中……您为什么不将图像存储在磁盘上并从数据库引用它们的相对路径?但公平地说,sqlite应该能够处理blob。我对完整答案的了解还不够,但为了减轻第一次查询的速度,您可以在启动时在后台运行查询。它不会做任何事情,但当您的代码尝试显示客户文档的第一个图像时,它不会是第一次这样做,并且应该与其他查询一样快速运行。尝试使用图像对象,如和中所示。您能解释一下这是如何工作的吗?这是一次性命令还是我应该每周/每月运行一次?我以为只要创建一个名为
ID
的字段作为整数自动递增,就可以完成索引工作……索引只需要创建一次。在大多数SQL版本中,如果索引存在性能问题,您可以重新生成索引(例如,您正在删除大量记录…将其视为碎片硬盘驱动器)。我相信这是在需要时重新编制索引的命令:reindex database_name.record_id_index;请参见此处的更多选项: