プログラミング
Lightning Memory-Mapped Database Manager (LMDB) 1.0
Lightning Memory-Mapped Database Manager (LMDB) 1.0 (lmdb.tech)
要約
LMDB 1.0は、BerkeleyDB APIに似たBtreeベースのデータベース管理ライブラリで、データベース全体をメモリマップで公開し、データ取得時にmallocやmemcpyが発生しないため、極めて高速かつメモリ効率が良いのが特徴です。ACIDトランザクションをサポートし、コピーオンライト戦略により高い耐障害性も備えています。複数のプロセスやスレッドからの同時読み書きに対応し、メンテナンス不要で運用できます。
全文翻訳
LMDB 1.0 メインページ 関連ページ モジュール データ構造 ファイル 全てのデータ構造 ファイル 関数 変数 型定義 列挙型 列挙子 マクロ グループ ページ Lightning Memory-Mapped Database Manager (LMDB) はじめに
LMDBは、BerkeleyDB APIに似たBtreeベースのデータベース管理ライブラリですが、大幅に簡略化されています。データベース全体がメモリマップで公開され、全てのデータ取得はマップされたメモリから直接データが返されるため、データ取得中にmallocやmemcpyは発生しません。そのため、ライブラリは独自のページキャッシュ層を必要とせず、極めてシンプルで、極めて高性能かつメモリ効率が良いです。また、完全なトランザクション機能を備え、完全なACIDセマンティクスを持ち、メモリマップが読み取り専用の場合、アプリケーションコードからの誤ったポインタ書き込みによってデータベースの整合性が損なわれることはありません。
注: これはLMDB 1.0のドキュメントです。LMDB 0.9のドキュメントはここにアーカイブされています。以前LMDB 0.9を使用していた場合は、リリース0.9からのアップグレードを参照してください。
ライブラリは完全にスレッドを認識しており、複数のプロセスやスレッドからの同時読み書きアクセスをサポートしています。データページはコピーオンライト戦略を使用しているため、アクティブなデータページが上書きされることはなく、破損に対する耐性も提供し、システムクラッシュ後の特別なリカバリ手順の必要性を排除します。書き込みは完全にシリアル化されており、一度にアクティブな書き込みトランザクションは1つだけなので、書き込み側がデッドロックに陥ることはありません。データベース構造はマルチバージョン化されているため、リーダーはロックなしで実行できます。書き込み側はリーダーをブロックできず、リーダーも書き込み側をブロックしません。
他の有名なデータベースメカニズムが、書き込み先行トランザクションログまたは追記型データ書き込みのいずれかを使用するのとは異なり、LMDBは運用中にメンテナンスを必要としません。書き込み先行ロガーと追記型データベースは、ログまたはデータベースファイルが際限なく増大するのを防ぐために、定期的なチェックポイントまたはコンパクションが必要です。LMDBはデータベース内の空きページを追跡し、新しい書き込み操作のために再利用するため、通常の利用ではデータベースサイズが際限なく増大することはありません。
メモリマップは読み取り専用または読み書きマップとして使用できます。デフォルトでは読み取り専用であり、これにより破損に対する完全な耐性が提供されます。読み書きモードを使用すると、書き込みパフォーマンスが大幅に向上しますが、ポインタを介した誤ったアプリケーション書き込みによってデータベースが静かに破損する可能性が加わります。もちろん、アプリケーションコードにバグがないことがわかっている場合(...)は、これは問題ではありません。
トランザクション型の組み込みキー/値ストアを初めて使用する場合は、開始ガイドページが役立つかもしれません。
注意点
ロックファイルのトラブルシューティング、およびBSDシステムでのセマフォ: 破損したロックファイルは同期の問題を引き起こす可能性があります。中断されたプログラムによって残された古いリーダー・トランザクションは、さらなる書き込みによってデータベースを急速に増大させ、古いロックはさらなる操作をブロックする可能性があります。修正: mdb_reader_check関数またはmdb_statツールを使用して、定期的に古いリーダーをチェックしてください。古い書き込みはほとんどのシステムで自動的にクリアされます: Windows - 自動 BSD、SysVセマフォを使用するシステム - 自動 Linux、Robustオプション付きPOSIXミューテックスを使用するシステム - 自動 それ以外の場合は、データベースを使用するすべてのプログラムを閉じてください。ロックファイルは、環境の最初のオープン時に常にリセットされます。
BSDシステムまたはMDB_USE_SYSV_SEMまたはMDB_USE_POSIX_SEMで設定されているその他のシステムでは、別のユーザーIDが所有するセマフォのために起動が失敗する可能性があります。修正: セマフォを所有するユーザー(おそらく最後のユーザー)またはrootとして、他のプロセスがデータベースを使用していない状態で、データベースを開閉してください。
制限/注意点(一部の関数でリストされているものに加えて): 通常、データベースの所有者のみがBSDシステムまたはMDB_USE_POSIX_SEMで設定されている場合にデータベースを使用する必要があります。前述のように、複数のユーザーが後で起動に失敗する可能性があります。リーダーはロックとロックファイルへの書き込みアクセスを必要とするため、通常は純粋な読み取り専用モードはありません。例外: 読み取り専用ファイルシステム上、またはmdb_env_open()の下で説明されているMDB_NOLOCKフラグを使用する場合。
LMDBの設定では、将来の成長のためにかなりの未使用メモリ空間およびファイルサイズを予約することがよくあります。これは実際のメモリやディスクスペースを使用しませんが、ユーザーは違いを理解する必要があるかもしれません。デフォルトでは、0.9.10より前のバージョンでは、データファイルの未使用部分は、他のコードによって解放されたメモリからのガベージデータを受け取る可能性があります。(これはMDB_WRITEMAPフラグを使用している場合には発生しません。)0.9.10以降、デフォルトの動作は、書き込み前にそのようなメモリを初期化することです。この初期化によるわずかなパフォーマンスコストが発生する可能性があるため、アプリケーションはMDB_NOMEMINITフラグを使用して無効にすることができます。機密データを扱うアプリケーションで、書き込みを許可したくない場合は、このフラグを使用しないでください。MDB_WRITEMAPを使用している場合は、このフラグは関係ありません。
1つのスレッドは、子トランザクションに加えて、一度に1つのトランザクションしか使用できません。各トランザクションは1つのスレッドに属します。以下を参照してください。MDB_NOTLSフラグは、読み取り専用トランザクションに対してこれを変更します。プロセス内で開かれたMDB_env*を使用してください。fork()の後ではありません。同じプロセスでLMDBデータベースを同時に2回開かないでください。プレーンなopen()呼び出しからでさえも、close()はfcntl()アドバイザリロックを壊します。(ロックファイルにはFD_CLOEXECが設定されているため、fork() - exec*() の後に再オープンすることは可能です。)長期間のトランザクションは避けてください。読み取りトランザクションは、新しい書き込みトランザクションによって解放されたページの再利用を防ぐため、データベースが急速に増大する可能性があります。書き込みトランザクションは、書き込みがシリアル化されているため、他の書き込みトランザクションを防ぎます。アクティブなトランザクションを持つプロセスを一時停止することは避けてください。これらは上記のように「長期間」になります。また、書き込み側がコミットしたときに一時停止された読み取りトランザクションは、誤ったデータを見る可能性があります。
...複数のプロセスがデータベースを同時に使用できる場合:
アクティブなトランザクションを持つプロセスを中止することは避けてください。トランザクションは、古いリーダーのチェックが実行されるか、ロックファイルがリセットされるまで、上記のように「長期間」になります。これは、プロセスがロックファイルから削除できないためです。これは、システムが古い書き込みをクリアする場合、書き込みトランザクションには適用されません(上記参照)。それでも行う場合は、古いリーダーの定期的なチェックを行ってください。または、時々環境を閉じて、ロックファイルがリセットできるようにしてください。
リモートファイルシステム上のLMDBデータベースを使用しないでください。同じホスト上のプロセス間でも同様です。これは、一部のOSでflock()を壊し、メモリマップの同期、そして異なるホスト上のプログラム間の同期を確実に壊します。
データベースを開くことは、別のプロセスが同時に開いているか閉じている場合に失敗する可能性があります。
著者 Howard Chu, Symas Corporation. Copyright Copyright 2011-2026 Howard Chu, Symas Corp. All rights reserved. 再配布およびソースコードまたはバイナリ形式での使用、変更の有無にかかわらず、OpenLDAP Public Licenseによって許可された場合にのみ許可されます。このライセンスのコピーは、配布物の最上位ディレクトリにあるLICENSEファイル、または代替としてhttp://www.OpenLDAP.org/license.htmlで入手できます。
派生元: Martin Hedenfalkによって書かれたbtree.cから派生しています。Copyright (c) 2009, 2010 Martin Hedenfalk marti.nosp@m.n@bz.nosp@m.ero.s.nosp@m.e このソフトウェアを、料金の有無にかかわらず、いかなる目的にも使用、コピー、変更、配布することを許可します。ただし、上記の著作権表示およびこの許可表示がすべてのコピーに表示されることを条件とします。本ソフトウェアは「現状有姿」で提供され、著者は、商品性および特定目的への適合性に関する黙示の保証を含む、本ソフトウェアに関する一切の保証を否認します。いかなる場合も、著者は、本ソフトウェアの使用またはパフォーマンスに起因または関連して発生する、使用、データまたは利益の損失から生じるいかなる特別、直接、間接、または結果的損害、または損害についても責任を負わないものとします。Generated on Tue Jun 30 2026 20:10:10 for LMDB by 1.8.2-20120930