2011-12-06 179 views
3

自从我将数据从ArrayList移到Android上的sqlite数据库后,我的性能下降严重。没有可能导致这种情况的游标被打开,所以我怀疑问题在于我存储在BLOB字段中的图像。Android sqlite/BLOB性能问题

应用程序创建有一个字段cardBitmap是被用在创建位图填充。

任何人都可以从他们的经验告诉我,有什么解决方案更高性能:

  1. cardBitmap持有引用(路径)SD卡上的文件将在创建绘制。只有路径存储在数据库中。
  2. cardBitmap保持物体(BitmapFactory.decodeStream(的ImageStream,NULL,NULL)),其中的ImageStream被读作一个ByteArrayInputStream的从相应的数据库字段。

任何建议将有所帮助。谢谢!

回答

6

您的第一个解决方案更好一个,使用sdcard中的文件并将参考路径存储在您的sqlite数据库中,这可以使您的性能更快,并且数据库保持轻量级。

+0

+1同意,SQLite针对简单类型存储和关系进行了优化,而非BLOB存储。 FileSystem更好地存储它。我目前正在将所有“内存中”数据模型移动到使用SQLite的直接访问过程中,并且我完全没有性能下降(仅使用简单的整数和文本字段),我感到非常惊讶。绝对要走的路。 – Guillaume

+0

自答案被接受以来事情似乎发生了变化:有报告称SQLite blob可能比使用文件系统更快,这取决于几个因素,但最重要的是每个二进制数据的大小。例如,请参阅https://www.sqlite.org/fasterthanfs.html。 – Chuim

9

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

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

他们已经完成了一个基准测试 - 不是在android上 - 这表明在SQLite中存储blob比在单独文件上存储小块(高达20kB)更快。 虽然对于大于100kB的斑点,性能下降很大,并且最好将您的blob存储在单独的文件中,就像您(user370605)推荐的那样。 请参阅http://www.sqlite.org/intern-v-extern-blob.html

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

+1

+1,很好的答案。也由一个实际的测试支持!我知道这不是Android,但研究仍然对Android平台有意义且有价值。 – andr

+1

我一直在寻找一些专门针对小斑点的基准。谢谢! – Geobits

0

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