【问题标题】:Android Lucene OutOfMemoryExceptoinAndroid Lucene OutOfMemoryExceptoin
【发布时间】:2012-09-14 17:07:35
【问题描述】:

我有一个 Lucene 索引,其中包含来自 1740 本书的 50571 个文档。我有两个创建此索引的进程。第一个过程是逐个文档在设备上创建索引。这个过程非常缓慢。另一个过程是在服务器上创建图书索引(与我在设备上创建它的方式完全相同)并下载并将其与主索引合并。这个创建主索引要快得多。无论哪种方式,创建索引都可以正常工作。

问题是,当我在下载合并索引上搜索时,我得到一个 OutOfMemoryException,但是当我使用在设备上创建的索引进行搜索时,我没有得到那个错误。我逐本书(下载合并)浏览并创建了索引书,并在每本书被索引后进行搜索;基于此,当我预订〜450时,我开始收到OutOfMemoryException

是什么导致我内存不足。

【问题讨论】:

  • 目前无法判断您的代码中是什么导致了这种情况。将异常堆栈跟踪和涉及的代码附加到您的问题中。我怀疑您构建了某种大数据结构来一次将所有数据保存在内存中。那个可能太大了。如果是这种情况,则分块处理数据。

标签: android memory lucene


【解决方案1】:

Lucene 是一个记忆猪。当将“合并”索引一起写入时,它将整个索引集存储在内存中两次。引用自 lucene documentation.

请注意,这需要目录中最多 2 倍的临时可用空间 所有输入索引的总和(包括起始索引)。 如果读者/搜索者对起始索引开放,则临时免费 所需空间会因起始索引的大小而增加

那是很多内存。为了缓解这种情况,我们必须通过在索引编写器上调用forceMerge(int) 来缩小索引的大小。这是一个缓慢的过程,但它确实缩小了索引的大小。每次索引目录中有 50 个或更多文件时,我都会使用 1 的参数调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多