【问题标题】:Improving the performance of reading blobs from a SQLite database提高从 SQLite 数据库读取 blob 的性能
【发布时间】:2016-05-19 12:57:42
【问题描述】:

我有一个 SQLite 数据库,其中包含存储为 blob 的小图像。我需要尽快读出几十张这样的图像,以便在用户界面中显示它们。

分析代码显示,绝大多数时间都花在了从数据库读取数据的 sqlite3_step 调用上。

如何提高这些读取的性能?

一个想法是让多个线程同时从数据库读取来提高性能,但是SQLite中的the threading documentation不是很清楚:是不是可以让多个线程同时从数据库读取,或者会读取总是被序列化,不管它们来自哪个线程?

还有其他方法可以提高从 SQLite 数据库读取 blob 的吞吐量吗?

【问题讨论】:

  • 一个想法是首先不要将大 blob 放入数据库中,而是将它们保留在文件系统中,并在数据库中保留对它们的引用。这是什么原因?性能。
  • @trojanfoe 同意,但在这种特殊情况下,这不是一个选项。
  • 那我想你得付出代价了。有一些技术可以提高插入性能,但我认为您对读取性能无能为力。
  • 话虽如此,您真的遇到了性能问题吗?如果您将图像存储在文件系统中,那么您可能会发现大部分时间都花在read() 中,但这仅仅是因为它是最昂贵的系统调用。但是,这并不一定意味着您有问题。
  • 为什么不使用文档目录来保存图像?您应该将图像放在文档目录中,并且应该将其名称(即路径)保存在 sqlite 数据库中。因此,您可以通过该名称快速使用它!

标签: ios database multithreading performance sqlite


【解决方案1】:

根据您的使用模式,一次从 SQLite 数据库读取多个线程是可能的,但不一定安全。

如果您使用序列化模式,多线程将无济于事,因为请求不会并行执行。该文档暗示多线程模式将允许您使用多个线程并行读取,但每个线程都需要有自己的数据库连接,因此这可能是尝试的选项;如果您不同时写入数据库,我怀疑这会更好。

您的应用程序的限制因素也可能是磁盘的读取速度,在这种情况下,线程无法帮助您,因为它们都访问同一个磁盘上的同一个 SQLite 数据库文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2013-09-20
    • 2011-04-14
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多