如果对象大小超过2GB,如何使用RAMDirectory并避免OutOfMemoryException

时间:2011-12-05 20:41:24

标签: c# lucene lucene.net out-of-memory ramdirectory

我一直使用RAMDirectory将整个索引放入内存中以提高性能,并且它的工作非常好,直到我的索引增长和增长。现在我得到了OutOfMemoryException。虽然我在磁盘上的索引是1.24GB,但我怀疑RAMDirectory对象的对象大小最终超过.NET 2GB对象大小限制,因此抛出了异常。另一个原因可能是虚拟地址空间过于分散,无法找到足够大的空洞来支持我的对象。

我很想继续使用RAMDirectory。如何在避免OutOfMemoryException的同时做到这一点?

请注意,当我编写索引时,我会调用IndexWriter.Optimize,因此整个索引都在一个大文件中。

1 个答案:

答案 0 :(得分:2)

继续使用我可以想到的RAMDirectory的唯一方法是将其拆分为几个较小的索引并使用MultiSearcher

这样你就可以避免.NET 2GB对象大小的限制,请注意,即使在64位上,单个对象的大小限制仍然是2GB,RamDirectory在内部保存一个字节数组来表示索引,这可能是如果它太大了会让它爆炸。

在我的拙见中,您应该考虑使用具有大索引的FSDirectory,对于大多数应用程序的预热后,速度通常都足够好。