3

私は 10 個のフィールドを持つ Lucene.net インデックスを持っています。一部は保存され、一部はインデックス化されており、4 億 6000 万のドキュメントがあります。インデックスは約250GBです。私は Lucene.net 3.0.3 を使用していますが、検索を行うたびに RAM で 2GB 以上を簡単に使い果たしてしまい、32 ビット アプリケーションでメモリ不足の例外が発生します。残念ながら、他の 32 ビットの依存関係のために、アプリを 64 ビット プロセスとして実行することはできません。

私の知る限り、Lucene のベスト プラクティスに従っています。

  • ドキュメントをバッチで書き込む 1 つのオープン インデックス ライター

  • 複数の検索で閉じたり開いたりしない共有リーダー

  • インデックス サーチャーのtermInfosIndexDivisorセットは 4 ですが、違いはないようです。1000 のような巨大なものに設定しようとしましたが、メモリの変更に気付きませんでした。

  • サブサーチする必要のないフィールドは分析されず (つまり、完全な文字列検索のみ)、検索から取得する必要のないフィールドは保存されません。

  • StandardAnalyzerインデックス作成と検索の両方にデフォルトを使用しています。

  • データを整理して小さなインデックスを作成すると、うまくいきます。サイズが約 50GB のインデックスがある場合、約 600MB の RAM だけで検索できます

ただし、フィールドの1つに並べ替えを適用していますが、並べ替えがなくても、検索でメモリ使用量が膨大になります。ドキュメントのスコアについては特に気にしません。ドキュメントがインデックスに存在することは特に気にしませんが、スコアの計算を無視することがメモリ使用量に役立つかどうかはわかりません。

私は最近、Lucene.net 2.9.4 から Lucene.net 3.0.3 にアップグレードしたところ、それが役立つかもしれないと考えていましたが、メモリ使用量は 2 つのバージョン間でほぼ同じに見えます。

率直に言って、このインデックスが 1 台のマシンで十分に検索するには大きすぎるかどうかはわかりません。私が見つけたほとんどの例では、サイズが 20 ~ 30GB 以下のインデックスについて話しているので、おそらくこれは不可能ですが、少なくとも質問したかったのです。

これを使いやすくするために私ができることについて何か提案があれば、それは素晴らしいことです。可能であれば、メモリ使用量のために検索速度を犠牲にしても構わないと思っています。

4

1 に答える 1

5

アプリを 64 ビットで実行できます。Lucene 部分用に別のプロセスを作成し、リモート処理を使用してそれ (または WCF) と通信します。終了した。標準的なアプローチ。

あなたはすでにそれを分割することを考えているので、それを分離して64ビットに置きます。

于 2012-12-19T19:24:23.353 に答える