質問

Linux 用の高速で信頼性が高く、メモリ効率の高いキーと値のデータベースが必要です。私のキーは約 128 バイトで、最大値のサイズは 128K または 256K です。データベース サブシステムは、約 1 MB を超える RAM を使用しないでください。データベースの合計サイズは 20G (!) ですが、一度にアクセスされるのはランダムなデータのほんの一部だけです。必要に応じて、一部のデータ BLOB をデータベースから (通常のファイルに) 移動できるため、サイズは最大 2 GB まで下がります。データベースは、システムクラッシュが発生しても、最近変更されていないデータを失うことなく存続する必要があります。読み取りは書き込みの約 100 倍になります。ブロックデバイス (ファイルシステムなし) をストレージとして使用できる場合は有利です。クライアント/サーバー機能は必要なく、ライブラリだけが必要です。Python バインディングが必要です (ただし、利用できない場合でも実装できます)。

どのソリューションを検討する必要がありますか?また、どれをお勧めしますか?

私が知っている候補者は次のとおりです。

  • 東京内閣 (Python バインディングは pytc, 、こちらも参照 pytc サンプルコード, 、ハッシュと B+ ツリー、トランザクション ログ ファイルなどをサポートし、バケット配列のサイズはデータベース作成時に固定されます。作成者は他の人にチャンスを与えるためにファイルを閉じる必要があります。多数の小さな書き込みを行い、それぞれのファイルを再度開くと非常に時間がかかります。Tyrant サーバーは、多数の小規模な書き込みを支援します。 東京キャビネット、東京タイラント、バークレーDBの速度比較)
  • VSDB (NFS 上でも安全、ロックなし。バリアはどうですか?更新は非常に遅いですが、cdb ほど遅くはありません。最終バージョンは 2003 年)
  • バークレーDB (クラッシュからの回復を提供します。トランザクションを提供します。の bsddb Python モジュールはバインディングを提供します)
  • サンバのTDB (トランザクションと Python バインディングを使用すると、一部のユーザー 汚職を経験した, 、 時々 mmap()ファイル全体、 repack この操作により、ファイル サイズが 2 倍になる場合があり、データベースが 2G より大きい場合 (64 ビット システムでも)、謎のエラーが発生し、クラスターの実装 (CTDB)も利用可能です。何度も変更を加えるとファイルが大きくなりすぎます。大量のハッシュ競合の後、ファイルが遅くなりすぎます。ファイルを再構築する組み込みの方法はありません。個々のハッシュ バケットをロックすることによる非常に高速な並列更新)
  • aodbm (追加専用なので、Python バインディングを使用してシステムクラッシュが発生しても存続します)
  • ハムスターデータベース (Python バインディングあり)
  • C ツリー (高性能で成熟した多用途の商用ソリューションですが、機能が制限された無料版があります)
  • 老人 TDB (2001年~)
  • ビットカスク (ログ構造化、Erlang で記述)
  • 他のさまざまな DBM 実装 (GDBM、NDBM、QDBM、Perl の SDBM、Ruby など)。おそらく適切なクラッシュリカバリーが備わっていないのでしょう)

これらは使用しません:

  • メムキャッシュDB (クライアントサーバー、バックエンドとして BereleleyDB を使用)
  • cdb (書き込みのたびにデータベース全体を再生成する必要があります)
  • http://www.wildsparx.com/apbcdb/ (同上)
  • レディス (データベース全体をメモリ内に保持します)
  • SQLite (定期的なバキューム処理を行わないと非常に遅くなります。sqlite のバージョン 3.1 以降では許可されていますが、Firefox 3.0 のロケーション バーのオートコンプリートを参照してください。 auto_vacuumいる;注意してください:小規模な書き込みトランザクションは非常に遅くなる可能性があります。注意してください:ビジーなプロセスが多くのトランザクションを実行している場合、他のプロセスは枯渇し、ロックを取得できなくなります)
  • モンゴDB (重すぎるため、値を内部構造を持つオブジェクトとして扱います)
  • 火の鳥 (SQLベースのRDBMS、重すぎる)

参考までに、 Key-Value データベースに関する最近の記事 Linuxマガジンに掲載されました。

参考までに、 古いソフトウェアのリスト

参考までに、 MemcacheDB、Redis、および Tokyo Cabinet Tyrant の速度比較

StackOverflow に関する関連質問:

役に立ちましたか?

解決

私は東京キャビネット/ pytc溶液で幸運を持っていました。 (私はあまりにもはるかに多くの読み取りを行うが)それは読み取りと書き込みの両方に、(少し速く私の実装でanydbmを使用して棚上げモジュールを使用するよりも)非常に高速です。私にとっての問題は、Pythonバインディングのスパルタのドキュメントでしたが、十分なサンプルコードは、あなたがする必要がある何をする方法を見つけ出すために周りがあります。 (Pythonバインディングがそうであるように)また、東京のキャビネットをインストールするのは非常に簡単で、(あなたが言及したように)サーバーを必要としない<ストライキ>と(安定しているが、もはやアクティブな開発中)積極的にサポートしているように見えるん。あなたは、同時アクセスを許可する、読み取り専用モードでファイルを開く、または読み取り/書き込みモード、データベースにアクセスしてから、他のプロセスを防止することができます。

私は夏に様々なオプションを見ていた、と私はそれから得たアドバイスは、このでした:異なるオプションを試してみると、あなたのために最高の作品かを参照してください。単に「最高」のオプションがあった場合、それはいいだろうが、誰もがわずかに異なる機能を探して、別のトレードオフを作るために喜んでされます。あなたは最高のを知っています。

(それは言った、あなたはあなたのための最高の働くことになったものを共有している場合、それは他の人に役立つことだろう、となぜあなたは他の人の上にそのソリューションを選択しました!)

他のヒント

LMDBは、周りの最もメモリ効率のデータベースです http://symas.com/mdb/inmem/する

完全にクラッシュプルーフ -

とも最も信頼性があることが証明。 http://wisdom.cs.wisc.edu/workshops/spring -14 /交渉/ Thanu.pdfする

あなたが言及したもののうち、東京内閣は破損の問題を文書化しています https://www.google.com/search?q=cfengine+tokyo +キャビネット+破損する

Bitcaskが行うように

BerkeleyDBのも、破損の問題を十分に文書化しています。 (そしてbitcaskが、とにかくあなたの1MBのRAM要件についてそれほど役に立たない、メモリ内の専用DBである。)

LMDBも利用できるカップル異なるバインディングで、Pythonでよくサポートされています。 https://github.com/dw/py-lmdb/する https://github.com/tspurway/pymdb-lightningする

免責事項 - 私はLMDBの著者です。しかし、これらの事実を文書化されています。LMDBは世界最小、最も効率的、かつ最も信頼性の高いキー/値の店で、他に何もどこにも近くに来ることはありません。

CDBが手元に20ギガバイトのことについては、それはあまりにも小さくし、GB 4までの任意のデータベースを扱うことができます。

Riakには、Linux上で実行され、あなたが動的にノードを追加することができます。

どのようにPythonの3.0のdbm.ndbmについてはどうですか?

他の提案は TDB の(Sambaのプロジェクトの一部)です。私は TDB のモジュールを介して、それを使用しました、しかし、私は「私が言うことができませんクラッシュした上で、その信頼性をテストしまし。私はそれを使用したプロジェクトは、このような要件を持っていなかった、と私は、関連する文書を見つけることができません。

どのようにSQLiteのでしょうか?

私は、Pythonでbsddb.hashlibを()を使用してきた、それはかなり良い働いています。

あなたが好きかもしれません DJBするの<のhref = "http://cr.yp.toあなたが言及する性質を持っている/cdb.html」のrel = "nofollowをnoreferrer"> CDB で、ます。

(同様の)クロスプラットフォームISAM形式のデータベースの、私はまた、 Firebirdの組み込みバージョンのための提案を受けましたのGLibするます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top