Couchdb如何存储重复的附件?

Couchdb如何存储重复的附件?,couchdb,Couchdb,我有一个CouchDB数据库,它主要存储文档附件 文件在数据库中排序,URL结构如下: /db name/numeric file id/official-human-readable-file-name.ext 一个文档始终只有一个附件。 今天,我计算了所有文件的md5总和,似乎其中有许多是重复的 我想知道couchdb是否知道重复的附件,并且在内部只存储指向文件的某种指针,并跟踪引用计数,或者只是按原样存储每个附件 我的意思是,如果我把5个相同的100MB文件作为附件,数据库会使用100MB

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

文件在数据库中排序,URL结构如下: /db name/numeric file id/official-human-readable-file-name.ext

一个文档始终只有一个附件。 今天,我计算了所有文件的md5总和,似乎其中有许多是重复的

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


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

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

实验:

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

结果:

db.coach文件的容量从8MB增加到16MB,第1、第2和第3次文档插入分别增加到24MB。因此,CouchDB确实而不是似乎在消除不同文档上相同附件的重复数据。添加三个文档后手动压缩数据库不会对文件大小产生任何影响,因此一些后台维护过程也不太可能注意到/修复这一点

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

  • 作者非常关心如何有效地处理大型附件,因此他们添加了存储附件的自动gzip压缩(对于那些具有表示某种文本内容的MIME类型的附件)

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

  • CouchDB似乎确实能够消除仍保存在DB中的同一文档的多个版本之间共享的相同附件的重复数据(可能是MD5摘要的一次使用)

  • 考虑到这些因素,令人惊讶的是CouchDB在这方面并不更聪明,因为它将是一个有价值的(可能的)直接优化