2011-12-05 6 views
0

パフォーマンスを改善するためにインデックス全体をRAMDirectoryを使用してメモリに格納しています。インデックスが成長して成長するまでうまく機能しました。今私はOutOfMemoryExceptionを得ています。ディスク上の私のインデックスは1.24GBですが、私はRAMDirectoryオブジェクトのオブジェクトサイズが.NET 2GBオブジェクトサイズの制限を超えてしまい、例外がスローされると思われます。別の理由は、仮想アドレス空間が断片化しすぎて、オブジェクトに十分な大きさの穴が見つからないことがあります。RAMDirectoryを使用し、オブジェクトサイズが2GBを超える場合にOutOfMemoryExceptionを回避する方法

私はRAMDirectoryを使い続けたいと思います。 OutOfMemoryExceptionを避けてどうすればいいですか?

インデックスを書くときには、IndexWriter.Optimizeと呼びますので、インデックス全体が1つの大きなファイルになるようにしてください。

+2

私はRAMDirectoryを使って検索するのに比べてスピードが飛躍的に向上すると思います。 私はそれを使わずに試してみると、インデックスを暖めるとパフォーマンスがかなり同等であることがわかります。ありがとう! –

+0

ありがとう!インデックスを暖めるためには何が必要ですか? – Barka

+0

64ビットオペレーティングシステムに切り替えます。 –

答えて

2

RAMDirectoryを使用し続ける唯一の方法は、いくつかの小さなインデックスで分割し、MultiSearcherを使用することです。

この方法では、.NET 2GBオブジェクトのサイズ制限を回避できます.64ビットでも1つのオブジェクトのサイズ制限が2GBであっても、RamDirectoryは内部的にインデックスを表す配列を保持し、おそらくそれはあまりにも大きい場合、それを爆破させるものです。

私の謙虚な意見では、おそらく大規模なインデックスを持つFSDirectoryの使用について考えなければならないでしょう。スピードは通常、ウォームアップ後のほとんどのアプリケーションで十分です。

+0

ありがとう!メモリ内のオブジェクトを使用して得られたパフォーマンスは、MultiSearcherを使用してパフォーマンスの低下によって相殺されるようです。 – Barka

+0

どのように暖めますか? – Barka

+0

サーチャーを再オープンしてキャッシュを構築できるようにするには、いくつかの典型的なクエリーを実行するだけです。私がこれを行う方法は、検索者を再度開いて、古いものを開いたままにしてクエリを提供し、新しいものをウォームアップすることです。ウォームアップすると、古いものを新しいもの(基本的に変数の値を変更する)に置き換え、スワップが完了した後に古いサーチャーを閉じます。 –

関連する問題