2013-07-31 7 views
5

インデックスファイルはFSdirectoryとしてハードで、サイズは約2GBです。私はより良い検索速度を持つためにRAMにロードしたい。私は後ろにコードを使用します:LuceneでFSdirectoryインデックスファイルをRAMdirectoryとして読み込む方法は?

Directory dic=new RAMDirectory(FSDirectory.open(new File("file path")), IOContext.DEFAULT); 

しかし、私はそれが動作するかどうかは分かりません。誰でもそれが動作するかどうかを知っていますか?これ以外の方法はこれ以上ですか?

私はどんな提案もうれしいでしょう。ありがとうございます。

+0

これは、RAMDirを使用しないで直接ロードする方が良いでしょう。osファイルキャッシュは、あなたのためにインデックスをmemにロードします。それに応じてjvm Xmxをセットアップすることを忘れないでください。あなたのケースでは少なくとも2Gのosにいくつかのfree memをしましょう。 (例えば、4GシステムではXmx2Gを使用する)。 – nomoa

+0

@nomoa私はあなたが本当に直接読み込んでいることを理解していませんでした。どうやってするの?私はtomcatで実行されているWebアプリケーションでそれを使用したいと考えています。 – anony

+0

私はあなたがRAMDirectoryでより良い検索速度を持っていないことを意味するjavaのdocを見てください:警告:このクラスは巨大なインデックスを扱うつもりはありません。 jvm paramsとos params(linux上でswappiness)を調整することで、より速い検索速度が得られます。いくつかのlucene perf FAQを見てください。 – nomoa

答えて

2

そうですね、RAMDirectoryを構築することはできますが、あなたのケースでは強くお勧めします。 RAMDirectoryは大きなデータセット(100MB以上)で使用するようには設計されていません。貴重なJAVAヒープ空間を構築して消費するためには、GC集中的で時間がかかります。

あなたはPERFの問題を持っている場合は、OSがメモリへのインデックスの一部をキャッシュする必要が下降検索速度を取得することを忘れないでください

this lucene FAQにdescibedすべてのガイドラインに従っていることを確認してください。これを行うには、OSにいくつかの無料のmemを利用できるようにする必要があります。 16Gbの物理RAMと8GBのインデックスがある場合は、8gでjvm Xmxを設定する必要があります。メモリをチェックする素晴らしいLinuxツールはhtopです。プロセスに使用されるRAM(ヒープスペース)とRAMがfilecacheとして黄色(インデックスデータ)として使用されます。

開発者の中には、アプリケーションの起動時にウォームアップクエリを実行して、インデックスがos filecacheによって読み込まれている間に最初のユーザーが数秒間立ち往生するのを防ぐものがあります。

あなたはまだあなたがRAMSでいくつかのトリックを試すことができますより良いperfを得ることができると思う場合。しかし、あなたはMMapDirectoryを使ってうまくチューニングされたOSやJVMよりも優れたパフォーマンスを得ることができるとは思っていません。

関連する問題