【问题标题】:Sqlite taking too long to fetch picturesSqlite 获取图片时间过长
【发布时间】: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/… 中看到。

标签: c# sqlite image


【解决方案1】:

您可能只是在使用零索引访问表深处的记录以提供帮助。也许添加一个索引?

CREATE INDEX record_id_index ON tbl_pictures(record_id);

【讨论】:

  • 您能解释一下这是如何工作的吗?它是 1 次命令还是我应该每周/每月运行一次?我认为只需创建一个名为 ID 的字段作为 Integer AUTO Increment,就可以完成索引工作...
  • 一个索引只需要创建一次。在大多数 SQL 版本中,如果索引存在性能问题,您可以重建索引(即,您要删除大量记录……将其视为碎片硬盘驱动器)。
  • 我相信这是在需要时重新索引的命令:REINDEX database_name.record_id_index;在此处查看更多选项:tutorialspoint.com/sqlite/sqlite_syntax.htm
【解决方案2】:

8k 或 16k 的数据库页面大小可能会更好 - SQLite 人员在http://www.sqlite.org/intern-v-extern-blob.html 有一个关于 BLOB 和性能的页面;但是,它似乎表明最大 100kB 的文件是可以的。比 100kB 大得多,性能会受到影响。

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多