java - 巨大的 XML 文件到文本文件

标签 java xml

我有一个巨大的 XML 文件 (15 GB)。我想将 XML 文件中的“文本”标签转换为单个页面。

示例 XML 文件:

<root>
    <page>
        <id> 1 </id>
        <text>
        .... 1000 to 50000 lines of text
        </text>
    </page>
    ... Like wise 2 Million `page` tags
</root>

我最初使用 DOM 解析器,但它抛出 JAVA OUT OF MEMORY(Valid)。现在,我已经使用 STAX 编写了 JAVA 代码。它运行良好,但性能确实很慢。

这是我写的代码:

 XMLEventReader xMLEventReader = XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(filePath));
    while(xMLEventReader.hasNext()){
      xmlEvent = xMLEventReader.nextEvent();

    switch(xmlEvent.getEventType()){
    case XMLStreamConstants.START_ELEMENT:
    if( element == "text")
      isText    = true;
    break;
    case XMLStreamConstants.CHARACTERS:
      chars = (Characters) xmlEvent;
      if(! (chars.isWhiteSpace() || chars.isIgnorableWhiteSpace()))
               if(isText)
              pageContent += chars.getData() + '\n';
      break;
    case XMLStreamConstants.END_ELEMENT:
      String elementEnd = (((EndElement) xmlEvent).getName()).getLocalPart();
      if( elementEnd == "text" )
      {
          createFile(id, pageContent);
          pageContent = "";
          isText = false;
      }
      break;
    }
}

此代码运行良好。(忽略任何小错误)。根据我的理解,XMLStreamConstants.CHARACTERS 为文本标记的每一行进行迭代。如果 TEXT 标记中有 10000 行,XMLStreamConstants.CHARACTERS 将迭代接下来的 10000 行。有没有更好的方法来提高性能..?

最佳答案

我可以看到一些可能对您有所帮助的解决方案:

  1. 使用 BufferedInputStream 而不是简单的 FileInputStream 来减少磁盘操作的次数
  2. 考虑使用 StringBuilder 来创建您的 pageContent 而不是字符串连接。
  3. 增加您的 Java 堆(-Xmx 选项)以防您的 2GB 示例内存受限。

在这种情况下,连接代码分析器(例如 Java VisualVM )可能会非常有趣,因为您可以准确地看到代码中哪些方法调用缓慢。然后,您可以适本地关注优化。

关于java - 巨大的 XML 文件到文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22241841/

相关文章:

xml - XML查询未返回预期结果

java - Android 应用程序因 Google map 对象而崩溃

java - 你能帮忙解决 Java 中的正则表达式问题吗?

使用任务控制进行 Java 分析 - 我在哪里可以看到我自己的方法所花费的时间?

java - 无法使用 EAP-7.2.0 和 JSF 读取 message.properties 文件

xml - 使用 xslt,如何添加在项目第一次出现之前开始并在项目最后一次出现之后结束的 xml 节点?

c++ - Tinyxml2 根集属性

java - Android 定时器的处理程序和可运行对象

java - Caused by : java. lang.OutOfMemoryError: Java heap space in BIRT 报告

java - 如何在 Eclipse 中从 java 源代码创建流程图