2012-03-15 4 views
2

私はCouchDBのデータベースで次の文書を持っている:私のローカルファイルシステムに保存されている場合サイズ

{ 
    "_id": "000013a7-4df6-403b-952c-ed767b61554a", 
    "_rev": "1-54dc1794443105e9d16ba71531dd2850", 
    "tags": [ 
     "auto_import" 
    ], 
    "ZZZZZZZZZZZ": "910111", 
    "UUUUUUUUUUUUU": "OOOOOOOOO", 
    "RECEIVING_OPERATOR": "073", 
    "type": "XXXXXXXXXXXXXXXXXXX", 
    "src_file": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
} 

このJSONファイルは、正確に319バイトをとります。私の文書はすべてこのようになっています(いくつかのフィールドには長さが異なるため、2〜3バイトを渡してください)。

私のデータベースには現在約6百万のドキュメントがあり、15GBを使用しています。それはおよそ2.5KBytes/documentを与えます。これは、文書がディスク上と同じようにCouchDBで8倍のスペースを取っていることを意味します。

なぜですか?

答えて

4

この問題は、ドキュメントIDの使用方法に関連しています。ドキュメント内だけでなく、他のデータ構造にも格納されています。つまり、標準のUUID(000013a7-4df6-403b-952c-ed767b61554a 36文字)を使用すると、大量のディスク領域が使用されます。コリジョンが軽微な問題である場合、Base64を使用すると、わずか4文字、 、5文字の1,000,000,000件のドキュメントに1600万のドキュメントを割り当てることができます。辞書のための良い選択は、(「ビュー照合」の意味で)注文したものである。

[email protected] 

この方法を使用して、私は0.4Kbytes /ドキュメントへの2.5Kbytesは/ DOCからの私のデータベースのサイズを縮小しています。私の新しいデータベースは古いデータベースのスペースのわずか16%を使用しています。これは非常に大きな改善点です。

0

CouchDBは、MVCCと呼ばれるものを使用しています。これは基本的に、ドキュメントの以前のバージョンを変更したときにそのドキュメントを保持することを意味します。これらの以前のバージョンを使用して競合が発生した場合のレプリケーションを支援し、デフォルトでは1000回のリビジョンを保持します(詳細はthisを参照)。

レプリケーションを使用していない場合や、これらの種類の競合が発生しないことがわかっている場合は、保持するリビジョンの数を減らすことができます。

compactionに慣れておくと、(一時的に)ストレージのフットプリントも小さくすることができます。

+2

リビジョンはありません。これは、新しく作成されたデータベースで、* new *ドキュメントのみが挿入されています。更新されたドキュメントはありません。実際には、couchdbの人々との問題を確認した後、私は問題を発見しました:couchdbの内部で多くの構造のために使用されているドキュメントIDは、データベースサイズに大きな影響を与えます。ドキュメントのサイズを小さくしたい場合は、base64(またはbase62などの)エンコードされたドキュメントIDを使用するのが簡単です。 – dangonfast