我一直使用RAMDirectory
将整个索引放入内存中以提高性能,并且它的工作非常好,直到我的索引增长和增长。现在我得到了OutOfMemoryException
。虽然我在磁盘上的索引是1.24GB,但我怀疑RAMDirectory
对象的对象大小最终超过.NET 2GB对象大小限制,因此抛出了异常。另一个原因可能是虚拟地址空间过于分散,无法找到足够大的空洞来支持我的对象。
我很想继续使用RAMDirectory
。如何在避免OutOfMemoryException
的同时做到这一点?
请注意,当我编写索引时,我会调用IndexWriter.Optimize
,因此整个索引都在一个大文件中。
答案 0 :(得分:2)
继续使用我可以想到的RAMDirectory
的唯一方法是将其拆分为几个较小的索引并使用MultiSearcher
。
这样你就可以避免.NET 2GB对象大小的限制,请注意,即使在64位上,单个对象的大小限制仍然是2GB,RamDirectory在内部保存一个字节数组来表示索引,这可能是如果它太大了会让它爆炸。
在我的拙见中,您应该考虑使用具有大索引的FSDirectory,对于大多数应用程序的预热后,速度通常都足够好。