使用Room存储二进制文件的链接以及元数据是一个好习惯吗?

时间:2018-05-01 22:30:51

标签: java android

我想知道您对以下内容的看法:假设您有多个结构化二进制文件(数百个)和一个可以使用它们的库(创建,打开,读取,保存)。你将如何设计一个Android应用程序来包装它:

  • Would you pack all the binary files in the Zip archive leave files separate in the application directory (subdirectory);

  • Would you use Room library to create links (Uri) to those files along with additional information like tags, titles, thumbnail images (also Uri) access them directly and save the extra in metafiles create a extra binary layer for each of the files to store the metadata (binaryWithMeta <- (metadata + binary))

1 个答案:

答案 0 :(得分:3)

1)房间只是SQLite的一个包装,你很幸运,他们已经问过并回答了BLOB性能问题。

  

SQLite中的内部与外部BLOB

     

下面的矩阵显示了读取存储在单独文件中的BLOB所需的时间除以读取完全存储在数据库中的BLOB所需的时间。因此,对于大于1.0的数字,将BLOB直接存储在数据库中会更快。对于小于1.0的数字,将BLOB存储在单独的文件中会更快。

     

enter image description here

     

我们从上面的矩阵中推导出以下经验法则:

     
      
  • 数据库页面大小为8192或16384,可为大型BLOB I / O提供最佳性能。
  •   
  • 对于小于100KB的BLOB,当BLOB直接存储在数据库文件中时,读取速度会更快。对于大于100KB的BLOB,从单独文件读取的速度更快。
  •   
     

当然,您的里程可能会有所不同,具体取决于硬件,文件系统和操作系统。 在提交特定设计之前,仔细检查目标硬件上的这些数据

来源:https://www.sqlite.org/intern-v-extern-blob.html,强调我的。

正如您所看到的,SQLite非常适合存储元数据,甚至是图像缩略图。

2)您的其他问题的答案取决于多种因素:

  • 文件大小(可能压缩大文件,可能将小文件放在数据库中)
  • 文件类型(不要压缩MP3,JPG等)
  • 访问频率(不要压缩经常访问的文件或缓存它们),
  • 是否必须支持低存储或RAM的低端设备......

是的,需要某种抽象层来优化处理不同类型条件下的不同类型的文件。没有一个好的答案。

期待Stack Overflow上可能存在的不言自明的答案。