Couchdb如何存储重复的附件?

时间:2013-04-30 12:37:27

标签: couchdb

我有一个CouchDB数据库,主要存储文档附件。

文件存储在db中,其URL结构如下:  /db-name/numeric-file-id/official-human-readable-file-name.ext

一个文档始终只有一个附件。 今天我已经计算了所有文件的md5总和,看起来很多都是重复的。

我想知道couchdb是否知道重复的附件,并且内部只存储某种指向文件的指针,并跟踪引用计数,或者只是按原样存储每个附件。

我的意思是,如果我将5个相同的100MB文件作为附件,那么数据库会使用100MB还是500MB?

1 个答案:

答案 0 :(得分:5)

我也无法在CouchDB文档中找到这个问题的直接答案,所以我设计了一个简单的实证测试(使用CouchDB 1.4):

实验:

我逐步添加了3个文档,每个文档都有几个文档之间相同的大(多MB)附件。然后,我在每次插入文档后检查生成的db.couch文件的磁盘大小。

结果:

db.couch文件分别从第一个,第二个和第三个文档插入的8MB增加到16MB,然后再增加到24MB。因此,CouchDB 似乎在不同文档上重复删除相同的附件。在添加三个文档后手动压缩数据库使文件大小没有差异,因此一些后台维护过程也不太可能会注意到/解决此问题。

鉴于以下三个观察结果,这种缺乏附件重复数据删除是一个奇怪的遗漏:

  1. 作者非常关注有效处理大型附件,他们为存储的附件添加了自动gzip压缩(对于那些MIME类型指示某种文本内容的人。)

  2. 添加附件会导致计算MD5摘要并将其与附件的元数据一起存储。

  3. CouchDB似乎重复删除了仍在数据库中保存的相同文档的多次转录中共享的相同附件(可能是MD5摘要的一次使用)。

  4. 鉴于这些因素,令人惊讶的是CouchDB在这方面并不是更加智能,因为它将是一个有价值的(可能)直接的优化。