2011-12-05 94 views
0

我一直在使用RAMDirectory將我的整個索引放入內存中以提高性能,並且它的工作非常好,直到我的索引增長並增長。現在我得到OutOfMemoryException。雖然我的磁盤索引爲1.24GB,但我懷疑RAMDirectory對象的對象大小最終超過.NET 2GB對象大小限制,因此拋出異常。另一個原因可能是虛擬地址空間太簡單,無法找到足夠大的空洞來放置我的對象。如何使用RAMDirectory並避免出現OutOfMemoryException如果對象大小超過2GB

我想繼續使用RAMDirectory。我該怎麼做,同時避免OutOfMemoryException

另請注意,當我編寫我的索引時,我呼叫IndexWriter.Optimize,因此整個索引都在一個大文件中。

+2

我想你會看到使用RAMDirectory進行搜索的速度最小化。 我會嘗試沒有它,我敢打賭,你會看到,性能是相當equivelent一旦你溫暖索引。 –

+0

謝謝!需要什麼來溫暖指數? – Barka

+0

切換到64位操作系統。 –

回答

2

繼續使用RAMDirectory我能想到的唯一方法是將其拆分爲幾個較小的索引並使用MultiSearcher

通過這種方式,您將能夠避免.NET 2GB對象大小限制,請注意,即使在64位上,單個對象的大小限制仍然爲2GB,RamDirectory在內部保存了一個字節數組來表示索引,如果它太大,可能會造成爆炸。

在我的小見解裏,你可能應該考慮使用一個FSDirectory,它具有大的索引,對於大多數應用程序來說,加熱後速度通常足夠好。

+0

謝謝!通過使用MultiSearcher,似乎通過使用內存對象獲得的性能將被性能損失所抵消。 – Barka

+0

我該如何預熱? – Barka

+0

當您重新打開搜索器時,只需運行幾個典型查詢,以便可以構建其緩存。我這樣做的方式是,當我重新打開搜索器時,我保持打開舊的搜索器,以繼續提供查詢並開始預熱新的搜索器。當它變熱時,我用新的替換舊的(基本上改變變量的值),並在交換完成後關閉舊的搜索器。 –

相關問題