0

我一直将我的整个索引放入内存中RAMDirectory以提高性能,并且它运行良好,直到我的索引不断增长。现在我得到了OutOfMemoryException。虽然我在磁盘上的索引为 1.24GB,但我怀疑对象的对象大小RAMDirectory最终超过了 .NET 2GB 对象大小限制,因此引发了异常。另一个原因可能是虚拟地址空间太碎片化,无法为我的对象找到足够大的洞。

我很想继续使用RAMDirectory. 我怎么能在避免的同时做到这一点OutOfMemoryException

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

4

1 回答 1

2

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

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

以我的拙见,您可能应该考虑使用具有大索引的 FSDirectory,它的速度通常对于大多数应用程序来说已经足够好了。

于 2011-12-06T15:06:03.137 回答