2011-12-05 40 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

当您重新打开搜索器时,只需运行几个典型查询,以便可以构建其缓存。我这样做的方式是,当我重新打开搜索器时,我保持打开旧的搜索器,以继续提供查询并开始预热新的搜索器。当它变热时,我用新的替换旧的(基本上改变变量的值),并在交换完成后关闭旧的搜索器。 –

相关问题