我注意到,每插入一些東西后我每次壓縮CouchDB實例,大小都會下降很多(有時甚至下降到20%)。當我壓縮CouchDB數據庫時實際發生了什麼?
我沒有刪除或修改任何數據,我所做的基本上是插入新記錄,結構緊湊,大小下降。
當我壓縮數據庫時實際發生了什麼?它以某種方式壓縮數據?或者是因爲每一個新紀錄都帶有一些垃圾,這些垃圾後來被小冊子刪除了?
我注意到,每插入一些東西后我每次壓縮CouchDB實例,大小都會下降很多(有時甚至下降到20%)。當我壓縮CouchDB數據庫時實際發生了什麼?
我沒有刪除或修改任何數據,我所做的基本上是插入新記錄,結構緊湊,大小下降。
當我壓縮數據庫時實際發生了什麼?它以某種方式壓縮數據?或者是因爲每一個新紀錄都帶有一些垃圾,這些垃圾後來被小冊子刪除了?
CouchDB使用僅附加文件格式。代碼永遠不會執行fseek(3)
。從頭開始的任何截斷的.couch
文件都是有效的數據庫文件。 (CouchDB從結尾向後掃描以找到它的「標題」)。
這種架構的成本在每次更改時都會寫入大量重複數據。基本上,couch會將新數據寫入文件末尾,然後寫入將數據併入數據樹所需的所有元數據更新,然後寫入一個新標題以永久提交所有這些數據。
因此,您可以獲得大量重複的元數據(內部b-tree節點等),更不用提舊文檔數據,可以在.couch
文件中建立起來。再一次,這是爲了支付永不覆蓋任何數據的防彈技術。
壓縮僅掃描舊的.couch文件中的相關數據,並僅將其寫入新的.couch文件。 B樹是平衡的,舊的文件不再存在了。它很好,很乾淨。
我的記錄是將300GB文件壓縮到6MB。 (它有相同的幾個文件的更新率非常高。) – JasonSmith 2012-03-20 13:05:07
哇,這是很多......當它涉及到如此大的分貝大小需要多長時間? – 2012-03-21 10:34:43
花了一點時間。 CouchDB從較大的文件中挖掘出「實時」數據,將該文件寫入(並且僅限於)新文件,然後重命名該文件,並且瞧! – JasonSmith 2012-03-22 02:40:18
即使您只插入數據,每次數據自上次查詢後發生更改時,您的視圖都會更新,這可能會導致相當多的浪費空間。這只是一個猜測。 – biziclop 2012-03-19 10:53:55