2012-02-07 58 views
6

複数のプログラムからlevelDBデータベースにアクセスする方法はありますか? dababaseを読み取り専用として開くオプションがありますか?今の同時に複数のlevelDBデータベースのインスタンス

のプログラムにから同じデータベースを開くときに、私が取得:

/path/to/dir/with/levelDBdatabase/LOCK: Resource temporarily unavailable 

乾杯を!

答えて

10

残念なことに、LevelDBはそのように設計されており、データベースの複数のインスタンスを開くことはできません。すべてのオプションは単一のプロセス用ですが、複数のスレッドがある場合は、スナップショットを取得して読み込み専用モードで反復処理(同時に他のスレッドが基になるデータベースに読み書きできるようになります)。

特定の動作を達成したいですか?もしそうなら、それが何であるかを私たちに知らせてください。

+0

ご回答ありがとうございます。私は、同じデータベースで検索するプログラムのいくつかのインスタンスを持っている可能性があります。私が考えている解決策は、levelDBの周りにクラスをラップしてから、levelDBへのアクセスを制御する方法と似ています。 – ezdazuzena

+1

ええ、時には簡単な答えがありません。これが助けになったといいなあ! – Kiril

+1

それからあなたは旗と+1を手に入れます。乾杯してください。 – ezdazuzena

3

だけ読み取り専用アクセスが必要な場合は、各プロセスはLevelDBフォルダのコピーを作成することができますlevelDBdatabase-copy1を使用し、代わりに元levelDBdatabaseを使用しての、そして、

cp -r /path/to/dir/with/levelDBdatabase /path/to/dir/with/levelDBdatabase-copy1

を。
プログラムが終了したら、そのコピーを安全に削除することができます。その後、

+0

あなたが待ち望んでいれば、各プロセスはロックを得るまで待つことができます。すぐにダンプを行い、終了します。 –

+0

良いアイデアだが、私は30Gbのデータベースをローカルに持っていればこれには時間がかかると感じている。 – forgetso

5

私は、各プロセスを持って、Linuxでこれを行うことができた、独自のディレクトリを作成(たとえば、$ HOME/.leveldb/myprogram_myPIDは)とします:

ln -s -t $HOME/.leveldb/myprogram_myPID /path/to/dir/with/levelDBdatabase/* 
rm $HOME/.leveldb/myprogram_myPID/LOCK 
touch $HOME/.leveldb/myprogram_myPID/LOCK 

次に$ HOME/.leveldb/myprogram_myPIDは読み取り専用leveldbデータベースとして使用することができ、プロセスの複数のインスタンスはデータベース全体をコピーせずに同時に実行できます。

誤って書き込みをしないようにするために、スナップショットを使用してデータベースにアクセスすることをお勧めします。また、プロセスが終了したら、新しいディレクトリを削除することを忘れないでください。

+1

これは役に立ちます...しかし実際には...このような "読み取り専用/非コミット"アクセスはライブラリに組み込まれていなければなりません。 –

関連する問題