CouchDB использует формат файла только для добавления. Код никогда не выполняет fseek(3)
. Любая усеченная часть файла .couch
, которая начинается с начала, является допустимым файлом базы данных. (CouchDB сканирует в обратном направлении от конца, чтобы найти свой «заголовок»).
Стоимость этой архитектуры заключается в записи большого количества дублирующихся данных каждый раз, когда вы вносите изменения. По сути, couch записывает ваши новые данные в конец файла, затем записывает все обновления метаданных, необходимые для включения этих данных в дерево данных, и записывает новый заголовок для постоянной фиксации всего этого.
Таким образом, вы получаете много повторяющихся метаданных (внутренние узлы b-дерева и т. Д.), Не говоря уже о данных старого документа, накапливающихся в файле .couch
. Опять же, это плата за пуленепробиваемую технику, никогда не перезаписывающую данные.
Сжатие сканирует только соответствующие данные из старого файла .couch и записывает только эти данные в новый файл .couch. Би-деревья сбалансированы, старых документов больше нет. Это красиво и чисто.