我一直在使用RAMDirectory将我的整个索引放入内存中以提高性能,它一直运行得很好,直到我的索引不断增长。现在我得到了OutOfMemoryException。虽然我在磁盘上的索引是1.24 2GB,但我怀疑RAMDirectory对象的对象大小最终超过了.NET 2 2GB的对象大小限制,因此抛出了异常。另一个原因可能是虚拟地址空间太过碎片化,无法为我的对象找到足够大的空洞。
我很乐意继续使用RAMDirectory。我如何在避免OutOfMemoryException的同时做到这一点呢?
还请注意,当我编写索引时,我调用了IndexWriter.Optimize,因此整个索引都在一个大文件中。
发布于 2011-12-06 23:06:03
我能想到的继续使用RAMDirectory的惟一方法是将它拆分为几个较小的索引并使用MultiSearcher。
这样你将能够避免.NET 2 2GB对象大小的限制,请注意,即使在64位上,单个对象仍然有2 2GB的大小限制,RamDirectory在内部保存了一个字节数组来表示索引,这可能是它太大时导致它爆炸的原因。
在我的愚见中,你可能应该考虑使用带有大索引的FSDirectory,在预热之后,它的速度通常对大多数应用程序来说已经足够好了。
https://stackoverflow.com/questions/8391575
复制相似问题