2016-03-23 19 views
2

私は、数億の小さなレコードのキーバリューストアとしてBerkelyDBを使用するプロジェクトを持っています。LMDBのメモリデータベース

すべての値がデータベースに挿入され、順次アクセスとランダムアクセスの両方を使用してすべての値が1つのスレッドから反復されます。

BerkeleyDBでは、「ディスク上に保存するつもりはない」in-memory databasesを作成できます。データベースがBerkeleyDBキャッシュに収まるくらい小さい場合は、ディスクに書き込まれません。キャッシュより大きい場合は、オーバーフローを保持するための一時ファイルが作成されます。このオプションを使用すると、データベースを閉じるときにアプリケーションがギガバイトのデッドデータをディスクに書き込むことを防ぐことができます。

私は、BerkeleyDBの書き込みパフォーマンスがSSD上であっても低すぎることを知りましたので、LMDBに切り替えたいと思います。しかし、documentation,に基づいて、非永続データベースを作成するオプションがないように見えます。

永続性または同時アクセスを気にしない場合、LMDBのパフォーマンスを最大限に引き出すために、どのような構成/オプションの組み合わせを使用する必要がありますか?つまり一時的なバッキングディスクストレージを備えた「メモリ内データベース」のように動作させるためですか?

答えて

1

MDB_NOSYNCを使用して、自分自身でmdb_env_sync()を決して呼び出さないでください。さらに、MDB_WRITEMAPを使用することもできます。 OSはやがて、汚れたページをディスクにフラッシュします。/proc/sys/vm/dirty_ratioなどで再生して、その動作を制御することができます。このポストから

+0

私はこれが、データベースが閉じられたときにディスクに書き込まれるすべての原因になると思いますか?データベース全体がメモリ内にある場合、これにより操作全体が大幅に遅くなります。 –

+0

ナンセンス。ファイルを閉じると、ファイルがフラッシュされません。 OSをフラッシュする前にファイルを閉じて削除すると、何も書き込まれません。 – hyc

+0

完全性のために、あなたはLinux上のほとんどの(すべてではないにしても)状況にぴったりです。しかし、これは他のオペレーティングシステム、またはすべてのファイルシステムの場合には必ずしも当てはまらない。 Mac OS Xで特定の状況下で 'close()'がブロックされるという証拠は少なくともあります。出典:http://blog.libtorrent.org/2012/10/asynchronous-disk-io/これらすべての種類のトリックと同様に実際にあなたのために働くかどうかを実験する必要があります。 –

0

https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

vm.dirty_ratioはすべてがディスクにコミットする必要があります前に、ダーティページを充填することができるシステムメモリの絶対最大量です。システムがこの点に達すると、ダーティページがディスクに書き込まれるまで、すべての新しいI/O がブロックにブロックされます。

汚れ率が小さすぎると、頻繁な同期ディスク書き込みが発生します。

関連する問題