【发布时间】:2013-07-25 00:05:38
【问题描述】:
我有一些大型数据库文件(每个大约 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();
这是我创建数据库文件时的属性:
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;
【问题讨论】:
-
你应该记住 SQLite 是基于文件的,所以很可能第一个查询需要更长的时间,因为很多东西都加载到内存中......
-
您是否有理由不将图像存储在磁盘上并从数据库中引用它们的相对路径?但公平地说,sqlite 应该能够处理 blob。
-
我对完整答案的了解还不够,但为了减轻第一次查询的速度,您可以在启动时在后台运行查询。它不会做任何事情,但是当您的代码尝试调出客户文档的第一张图片时,它不会是第一次这样做,并且应该与您的其他查询一样快地运行。
-
尝试使用 Image 对象,您可以在 stackoverflow.com/questions/330346/… 和 stackoverflow.com/questions/891617/… 中看到。