7

SSD にハッシュ配列を使用して、16/32 バイトの何億ものキーと値のペアを格納するのに苦労しています。

京都キャビネットで : 正常に動作しているときは 70000 record/s で挿入します。低下すると、10 ~ 500 レコード/秒に低下します。デフォルト設定では、ドロップは約 100 万レコード後に発生します。ドキュメントを見ると、これが配列内のデフォルトのバケット数であるため、理にかなっています。この数を 2,500 万に増やしましたが、実際、約 2,500 万レコードまでは問題なく動作します。問題は、バケットの数を 3000 万以上にプッシュするとすぐに、挿入レートが最初から 10 ~ 500 レコード/秒に低下することです。京都キャビネットは、データベース作成後にバケット数を増やすようには設計されていないため、2,500 万件を超えるレコードを挿入することはできません。

1/バケット数が 25M を超えると、KC の挿入レートが非常に低くなるのはなぜですか?

Berkeley DBの場合: 最高速度は KC よりわずかに低く、50000 レコード/秒に近いですが、それでも問題ありません。デフォルト設定では、KC と同様に、約 100 万件のレコードで速度が急激に低下します。BDB は、バケットの数を徐々に拡張するように設計されていることを知っています。それにもかかわらず、HashNumElements と FillFactor をいじって初期数を増やそうとしましたが、これらの試みのいずれも状況を悪化させました。そのため、DBD を使用して 100 万から 200 万を超えるレコードを挿入することはまだできません。非同期トランザクションを有効にしてみたり、さまざまな速度のチェックポイントを試したり、キャッシュを増やしたりしました。ドロップダウンを改善するものは何もありません。

2/ 100 万から 200 万回の挿入後に BDB の挿入率が低下する原因は何ですか?

注:私は Java を使用しています。速度が低下すると、CPU 使用率が 0 ~ 30% に低下し、正しい速度で作業すると 100% になります。
注:プロセスを停止して挿入を再開しても、何も変わりません。したがって、メモリ制限やガベージ コレクションとは関係ないと思います。

どうも。

4

1 に答える 1

3

以下は、KC で発生した書き込み制限にもかかわらず、何十億ものレコードを保存する方法を示しています。

せっかく頑張ったのに、京都内閣もBerkeley DBもまだ解決していません。しかし、Kyoto Cabinet を使用して興味深い回避策を思いつきました。

1 つの KC ファイルに 25M を超えるレコードを書き込めないことに気付きましたが、読み取りにはそのような制限はありません。データベースのサイズに関係なく、常に高速です。私が見つけた解決策は、25M の新しいレコードごとに新しい KC ファイル (新しいデータベース) を作成することです。そうすれば、読み取りは多くの KC ファイルで発生し、それでも高速であり、書き込みは最後に作成されたファイルでのみ発生し、同様に高速です。残っている問題は、以前のファイルのレコードの更新/削除を許可することだけでした。そのために、次の SSTables アプローチをコピーしました

  • 0 から N-1 のファイルはすべて読み取り専用で、ファイル N は読み取り+書き込みです。
  • 挿入/更新/削除はファイル N に書き込まれます。
  • 読み込みはファイル N から 0 を調べ、最初に見た/最後に書き込んだ挿入/更新/削除を返します。
  • 必要なレコードを持たないファイルへのアクセスを避けるために、ブルーム フィルターが各ファイルに添付されます。
  • ファイル N が 25M レコードに達するとすぐに読み取り専用になり、ファイル N+1 が作成されます。

ノート :

  • SSTable の場合と同様に、多くの更新/削除が実行される場合、圧縮を実行する必要がある場合があります。ただし、SSTable とは異なり、ここでの圧縮ではファイルを書き換える必要はありません。古くなったレコードは KC ファイルから単純に削除されます。KC ファイルが非常に小さくなった場合は、ファイル N にレコードを再挿入して削除するか、次のファイルがコンパクトであれば、新しい挿入のために再度開くことができます。
  • 削除はレコードを削除しませんが、レコードが削除されたことを識別する特別な値を書き込みます。圧縮中、削除されたレコードは実際に削除されます。
  • 通常、レコードが存在するかどうかを確認するには、データベースを調べる必要があります。ブルーム フィルターのおかげで、否定的な回答のほとんどは、ディスクにアクセスしなくても与えることができます。
于 2012-10-25T22:48:35.580 に答える