Android sqlite / BLOB 性能问题

Posted

技术标签:

【中文标题】Android sqlite / BLOB 性能问题【英文标题】:Android sqlite / BLOB perfomance issue 【发布时间】:2012-01-14 02:12:42 【问题描述】:

自从我将数据从 ArrayList 移动到 android 上的 sqlite 数据库后,我的性能出现了严重下降。没有任何光标处于打开状态可能导致这种情况,所以我怀疑问题出在我存储在 BLOB 字段中的图像上。

应用程序创建卡片,其中有一个字段cardBitmap,该字段在创建时填充位图。

谁能根据他们的经验告诉我,哪种解决方案更高效:

    cardBitmap 包含对 SD 卡上文件的引用(路径),该文件将在创建时绘制。只有路径存储在 DB 中。 cardBitmap 持有一个对象 (BitmapFactory.decodeStream(imageStream,null,null)),其中 imageStream 被读取为 ByteArrayInputStream em> 来自相应的数据库字段。

任何建议都会有所帮助。谢谢!

【问题讨论】:

如果关心性能,显然只存储路径会更好.. 【参考方案1】:

我还没有评论答案的声誉,所以我将添加我的 2cts 作为答案,请原谅我。

我一直在寻找类似问题的答案,但我认为当前的答案并不令人满意,因为如果您询问 SQLite.org,他们会告诉您这取决于 blob 大小和页面大小。

他们已经做了一个基准测试——虽然不是在 android 上——这表明在 SQLite 中存储小 blob(最大 20kB)比存储在单独的文件中更快。 但是,对于大于 100kB 的 blob,性能下降很大,最好按照您 ( user370605 ) 的建议将 blob 存储在单独的文件中。 见http://www.sqlite.org/intern-v-extern-blob.html

我会考虑有关 Android 的未回答问题。

【讨论】:

+1,很好的答案。也有实际测试支持!我知道这不是 Android,但这项研究对于 Android 平台仍然很有趣且有价值。 我一直在寻找一些专门针对小斑点的基准。谢谢!【参考方案2】:

您的第一个解决方案更好,使用 sdcard 中的文件并将引用路径存储在您的 sqlite 数据库中,这样可以提高性能,并且您的数据库仍然很轻。

【讨论】:

+1 同意,SQLite 针对简单类型存储和关系进行了优化,而不是 BLOB 存储。 FileSystem 存储它要好得多。我目前正在移动我所有的“内存中”数据模型以使用对 SQLite 的直接访问,我很惊讶根本没有性能下降(仅使用简单的整数和文本字段)。绝对是要走的路。 自从这个答案被接受后,情况似乎发生了变化:有报道称,SQLite blob 可能比使用文件系统更快,这取决于几个因素,但最重要的是每条二进制数据的大小。例如,请参阅sqlite.org/fasterthanfs.html。【参考方案3】:

我也没有足够的声誉来做 cmets。我正在添加此答案以帮助任何仍在寻找建议的人。经过几年的硬件改进,这两种解决方案的性能差别不大。我在我的 Nexus 6p 中尝试过几次,将大约 2 MB 的二进制图像写入 SQLite 平均只需要 50 毫秒。尽管外部存储性能会更好,但目前的性能可以满足我的预期。写入 SQLite 不需要 WRITE_EXTERNAL_STORAGE 权限,如果从其他应用程序授予权限,该权限可能会被撤销。在这种情况下,SQLite 可能是一个不错的选择。

【讨论】:

以上是关于Android sqlite / BLOB 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Android sqlite 数据库中检索大 blob

不理解?为啥我们在“Android Sqlite”中需要 BLOB

Android 在保存到 SQLITE 时更改像素或图像大小

Blob Row 太大太适合 Android

Android SQLite性能分析

Android 和 iOS 上 SQLite 的性能差异