【问题标题】:Lucene Memory UsageLucene 内存使用
【发布时间】:2015-06-15 21:51:43
【问题描述】:

我正在索引约 250.000 个文档,但在 200.000 左右后达到了 OOME(在此之前,它变得非常慢,直到达到 GC 限制)。

代码如下(我用的是jpype):

def index_documents(self, documents):
    writer = IndexWriter(self.store, self.config)
    for document in documents:
        self.indexDocument(document,writer)

    writer.commit()
    writer.close()

def indexDocument(self, document, writer):
    doc = Document()
    doc.add(Field('text',document['text'],TextField.TYPE_STORED))
    doc.add(Field('title',document['title'],TextField.TYPE_STORED))
    doc.add(Field('url',document['url'],StringField.TYPE_STORED))
    doc.add(Field('domain',document['domain'],StringField.TYPE_STORED))
    doc.add(Field('category',document['category'],StringField.TYPE_STORED))

    writer.addDocument(doc)

我希望文档和字段会被刷新,然后每隔一段时间进行一次垃圾收集,因此应该不可能命中 OOME。相反,某处似乎有泄漏。如何确定这是否是 lucene 或 jpype 的问题?假设这是一个 lucene 问题,我有什么可能减少内存使用?我可以诊断冲洗的频率或类似情况吗?

【问题讨论】:

  • 似乎是writer 需要刷新。因为只有在处理完所有文档后才提交(导致 OOME)。
  • @Kayaman 我是否理解错误的文档?在我看来,在一定的内存使用/文档计数之后,刷新应该是自动的。
  • 确实如此。您应该在其上运行jvisualvm 以查看内存发生了什么。
  • @Kayaman 谢谢,自从我上次使用 jvisualvm 已经有一段时间了,我没有想到这一点。我发现它可能是我的第三方令牌过滤器之一泄漏了内存。
  • JPype 中存在 has been fixed 但尚未发布的 OOM 问题。请尝试当前的主人。

标签: java lucene jpype


【解决方案1】:

正如 bastian 所说,更新 JPype 解决了这个问题。该修复程序实际上已在 0.6.0 版中发布。

此外,如果没有 Jpype 错误,我可能不会在第三方组件中发现内存泄漏 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2016-07-15
    • 2020-03-02
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多