安卓sqlite / BLOB性能问题

4
自从我将数据从ArrayList移动到Android上的sqlite数据库后,我的性能严重下降。没有遗留未关闭的游标可以导致这种情况,因此我怀疑问题出在存储在BLOB字段中的图像上。
应用程序创建“卡片”,它们具有一个字段cardBitmap,在创建时会填充位图。
从您的经验中,有人能告诉我哪种解决方案更具有效率:
1. cardBitmap保存对SD卡上文件的引用(路径),该文件将在创建时绘制。仅将路径存储在数据库中。
2. cardBitmap保存一个对象(BitmapFactory.decodeStream(imageStream,null,null)),其中imageStream作为ByteArrayInputStream从相应的数据库字段读取。
感谢任何建议。谢谢!

显然,如果一个人关心性能,仅存储路径会更好。 - Ewoks
3个回答

11

我还没有足够的声誉来评论答案,所以我将把我的2分钱作为答案添加,敬请谅解。

我正在寻找类似问题的答案,我认为目前的答案并不令人满意,因为如果您向SQLite.org提问,他们会告诉您它取决于blob大小和页面大小。

他们进行了一项基准测试 - 虽然不是在Android上 - 显示将blob存储在SQLite中对于小型blob(最多20kB)比单独文件中存储更快。 然而,对于大于100kB的blob,性能下降很大,并且最好像user370605建议的那样将blob存储在单独的文件中。 请参见http://www.sqlite.org/intern-v-extern-blob.html

就Android而言,我认为这个问题尚未得到回答。


1
+1,好答案。同时还有实际测试的支持!我知道这不是针对Android的,但研究结果仍然对Android平台非常有价值和有趣。 - andr
1
我一直在寻找有关小型 Blob 的基准测试数据,谢谢! - Geobits

8

你的第一个解决方案更好,使用来自sd卡的文件并将参考路径存储在sqlite数据库中,这样可以提高性能并使数据库保持轻量级。


+1 同意,SQLite 优化了简单类型的存储和关系,而不是 BLOB 存储。FileSystem 更适合存储它。我目前正在将所有我的“内存”数据模型移动到直接访问 SQLite 上,并且我很惊讶地发现根本没有性能下降(仅使用简单的整数和文本字段)。绝对是正确的方法。 - Guillaume
1
自从这个答案被接受以来,情况似乎已经发生了变化:有报道称,在某些因素的影响下,尤其是每个二进制数据块的大小,SQLite blobs 可能比使用文件系统更快。例如,请参阅 https://www.sqlite.org/fasterthanfs.html。 - Chuim

1

我没有足够的声望来进行评论。我添加了这个答案来帮助仍在寻找建议的任何人。经过几年的硬件改进,这两种解决方案的性能差异很小。我在我的Nexus 6p上尝试了几次,将大约2 MB的图像二进制写入SQLite只需要平均50毫秒。即使外部存储性能更好,当前性能也可以满足我的期望。写入SQLite不需要WRITE_EXTERNAL_STORAGE权限,如果从其他应用程序授予权限,则可能被撤销。在这种情况下,SQLite可以是一个不错的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接