为什么Lucene在索引大文件时会导致OOM?

2023-11-21

我正在使用 Lucene 2.4.0 和 JVM (JDK 1.6.0_07)。我不断收到OutOfMemoryError: Java heap space,当尝试索引大型文本文件时。

示例 1:对 5 MB 文本文件建立索引会导致内存不足,最大容量为 64 MB。堆大小。所以我增加了最大值。堆大小为 512 MB。这适用于 5 MB 文本文件,但 Lucene 仍然使用 84 MB 堆空间来执行此操作。为什么这么多?

班上FreqProxTermsWriterPerField根据 JConsole 和 Eclipse Ganymede 的 TPTP 内存分析插件,Ganymede 似乎是迄今为止最大的内存消耗者。

示例 2:对 62 MB 文本文件建立索引会导致内存不足,最大容量为 512 MB。堆大小。增加最大值将堆大小设置为 1024 MB 可以,但 Lucene 在执行此操作时使用 826 MB 的堆空间。似乎仍然使用了太多的内存来执行此操作。我确信较大的文件会导致错误,因为它看起来是相关的。

我使用的是具有 2 GB RAM 的 Windows XP SP2 平台。那么索引大文件的最佳实践是什么?这是我正在使用的代码片段:

// Index the content of a text file.
private Boolean saveTXTFile(File textFile, Document textDocument) throws MyException {           

        try {             

              Boolean isFile = textFile.isFile();
              Boolean hasTextExtension = textFile.getName().endsWith(".txt");

              if (isFile && hasTextExtension) {

                    System.out.println("File " + textFile.getCanonicalPath() + " is being indexed");
                    Reader textFileReader = new FileReader(textFile);
                    if (textDocument == null)
                          textDocument = new Document();
                    textDocument.add(new Field("content", textFileReader));
                    indexWriter.addDocument(textDocument);   // BREAKS HERE!!!!
              }                    
        } catch (FileNotFoundException fnfe) {
              System.out.println(fnfe.getMessage());
              return false;
        } catch (CorruptIndexException cie) {
              throw new MyException("The index has become corrupt.");
        } catch (IOException ioe) {
              System.out.println(ioe.getMessage());
              return false;
        }                    
        return true;
  }

作为评论回应Gandalf

我可以看到您将 setMergeFactor 设置为 1000

API 说

设置合并因子

公共无效setMergeFactor(int 合并因子)

确定频率 段索引合并为 添加文档()。使用较小的值,索引时使用更少的 RAM, 和 对未优化索引的搜索是 速度较快,但索引速度较慢。值越大,使用的 RAM 就越多 索引期间,并且在搜索时 未优化的索引速度较慢, 索引速度更快。因此更大的值 (> 10) 最适合批量索引 创建和较小的值 (

此方法是一种方便的方法,当您增加 mergeFactor 时它会使用 RAM

我建议将其设置为 15 左右。 (在试验和错误的基础上)补充setRAMBufferSizeMB,也调用Commit(). then 优化()进而close()Indexwriter 对象。(可能创建一个 JavaBean 并将所有这些方法放在一个方法中)在关闭索引时调用此方法。

发布您的结果,反馈=]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Lucene在索引大文件时会导致OOM? 的相关文章

随机推荐

  • C# 将 GMT 日期字符串解析为 DateTime

    我在用着http www eyecon ro bootstrap datepicker 插件选择日期 选择日期后我得到例如Fri Nov 01 2013 00 00 00 GMT 0100 1 如果我使用 format 设置插件 为什么我会
  • 覆盖 AngularJS URL 验证器

    AngularJS 接受这个作为有效的 URL var URL REGEXP ftp http https w 0 1 w S 0 9 w Django 接受这一点 regex re compile r http ftp s http or
  • Objective-C 中的字符串常量是如何存储/检索的?

    有人可以解释编译器在何处以及如何存储字符串常量以及运行时如何访问它们吗 首先是强制性的 你不应该关心编译器如何做到这一点 任何基于编译器如何执行此操作的行为都是对无法保证的事物的危险依赖 并且可能会根据编译器的优化方式而改变 不要基于此编写
  • jQuery 未按正确顺序执行?

    我最近开始使用 jQuery 今天注意到它对我的行为有一个奇怪的问题 据我了解 JavaScript 是单线程的 因此它的所有操作都应该以 FIFO 为基础运行 然而 对我来说情况似乎并非如此 请考虑以下事项 设置如下 HTML 3 div
  • IntelliJ 中关于 Groovy 类的“类已存在”错误

    在 IntelliJ 2016 2 及之前版本 中 我们将 Groovy 类标记为红色 并显示错误 类已存在 我认为我们可以排除存根生成的原因 因为它已被停用 可能是我们的星座引起的 我们已将编译的 groovy 和 java 类包含在注册
  • 为什么 Spring AOP 不在运行时编织外部 jar?

    我有一个基于 Spring 3 构建的 java 应用程序 该项目有另一个 jar 作为依赖项 该依赖项包含一个 org aspectj lang annotation Aspect类 可以说 com aspectprovider aspe
  • SonarQube 无法启动 MariaDB 10

    我在 CentOS 7 中使用 yum 安装了 MariaDB SonarQube 抛出此异常 org sonar api utils MessageException Unsupported mysql version 5 5 Minim
  • 正则表达式字边界和特殊字符

    我有一个正则表达式来转义搜索字符串中的所有特殊字符 这很好用 但是我似乎无法让它与单词边界一起工作 例如 用干草堆 add or add 和针 正则表达式 gi匹配 然而正则表达式 b gi没有 关于如何实现这项工作有什么想法吗 Using
  • 无法建立 SSL 连接,如何修复我的 SSL 证书?

    我试图wget到我自己的盒子 它不能是 wget 中的内部地址 另一位开发人员是这么说的 当我得到时 我得到这个 wget http example com 2013 03 01 15 03 30 http example com Reso
  • Java中的正则表达式用于验证用户名

    我正在尝试使用 Java 中的用户名链 规则如下 长度 gt 3 有效字符 a z A Z 0 9 点 破折号和下划线 有人可以帮我解决正则表达式吗 尝试这个正则表达式 a zA Z0 9 3
  • 使用 MVVM 上下文菜单项命令绑定 WPF

    我知道这个问题已经在许多网站和 StackOverFlow 中以不同的方式被问过很多次 但我找到的所有答案都没有帮助我 准确地说 我无法理解它们并在我的应用程序中实现 所以我想从我的应用程序中添加一些代码 以便你们可以更好地帮助我 问题陈述
  • python 中 Burrows-Wheeler 的性能问题

    我试图实施布罗斯 惠勒在Python中进行转换 这是在线课程的作业之一 但我希望我已经做了一些工作才有资格寻求帮助 该算法的工作原理如下 获取一个以特殊字符 在我的例子中为 结尾的字符串 并从该字符串创建所有循环字符串 按字母顺序对所有这些
  • 为什么inline-block会导致这个div有高度呢?

    jsFiddle Demo 我似乎无法弄清楚为什么使用display inline block会导致这个 div 当包含元素被隐藏时 元素以某种方式获得高度 这不会发生在display block html div style displa
  • 在 hadoop 中并行运行作业

    我是 hadoop 新手 我已经设置了一个 2 节点集群 如何在 hadoop 中并行运行 2 个作业 当我提交作业时 它们按照 FIFO 顺序一项一项地运行 我必须并行运行这些作业 如何实现这一目标 谢谢 MRK Hadoop 可以配置多
  • 为什么 WaitForMultipleObjects 在使用多个线程句柄时会失败?

    在下面的测试程序中 每个测试线程将其句柄添加到全局TThreadList当它开始执行时 并在执行即将结束时从同一列表中删除其句柄 此外 出于测试目的 每个线程确保在主线程锁定列表之前添加其句柄 以复制其句柄并开始等待它们完成 这些线程还确保
  • 使用 find 和 sed 将文件名添加到文件开头

    使用以下内容 我将文件名添加到每行的前面 并将输出发送到单个文件 ls while read file do sed e s file g file gt out done 我想执行同样的操作sed替换但使用find and exec or
  • Xcode 4.2 iOS 5:来自 UITableView 的多个 Segues

    我现在开始使用适用于 iOS5 的 Xcode 4 2 有一些更改 我现在遇到一个问题 我无法找到解决方法 我正在使用 UITablwView 做一个示例 该视图以编程方式填充了 2 个部分 第 1 部分仅包含 1 行 第 2 部分包含 3
  • 访问Linux /dev/USB作为标准文件与USB设备通信

    我正在研究在 Linux 中与 USB 设备通信的方法 并且不想编写 Linux 内核驱动程序 我知道 libusb 存在并且是一个可以工作的用户空间库 但是我们的嵌入式设备不支持 usbfs 并且更改内核以添加支持确实很痛苦 所以我的问题
  • iOS13 模拟器上的 UIDocumentBrowserViewController 错误“无法为 url 创建 urlWrapper”

    我有一个非常奇怪的问题UIDocumentBrowserViewController在 iOS 13 上测试时 importHandler newDocumentURL move 似乎没有任何原因崩溃 DocumentManager Can
  • 为什么Lucene在索引大文件时会导致OOM?

    我正在使用 Lucene 2 4 0 和 JVM JDK 1 6 0 07 我不断收到OutOfMemoryError Java heap space 当尝试索引大型文本文件时 示例 1 对 5 MB 文本文件建立索引会导致内存不足 最大容