【问题标题】:Processing large xml files处理大型 xml 文件
【发布时间】:2011-01-22 00:49:54
【问题描述】:

我有一个包含许多子元素的大型 xml 文件。我希望能够运行一些 xpath 查询。我尝试在 java 中使用 vtd-xml,但有时会出现内存不足错误,因为 xml 太大而无法放入内存。有没有另一种方法来处理这么大的 xml。

【问题讨论】:

  • 为什么这个问题上的 Python 标签?你希望人们提供 Python 解决方案吗?
  • 在解析文档或尝试 xpath 查询时是否出现内存不足错误?如果是第二个,问题可能出在 xpath 查询上。无论哪种方式,您是否尝试为 JVM 增加堆的 -Xmx 值?
  • 尝试扩展 vtd-xml 并使用内存映射选项

标签: java xml out-of-memory


【解决方案1】:

试试http://code.google.com/p/jlibs/wiki/XMLDog

它使用 sax 执行 xpath,而不创建 xml 文档的内存表示。

【讨论】:

    【解决方案2】:

    SAXParser 在处理大文件时非常高效

    【讨论】:

    • 您不能将 XPath 与直接 SAX 流一起使用(没有为每个查询重新解析整个文件)。
    • @Glenn Maynard - 但肯定 OP必须为每个查询(或一批查询)重新解析文件。 DOM 太大而无法放入内存。
    【解决方案3】:

    你现在想做什么?听起来您正在尝试使用基于 DOM 的解析器,它本质上将整个 XML 文件作为 DOM 表示加载到内存中。如果您正在处理一个大文件,最好使用 SAX 解析器,它以流方式处理 XML 文档。

    我个人为此推荐StAX

    【讨论】:

      【解决方案4】:

      您使用的是标准 vtd 还是扩展 VTD-xml?如果您使用扩展 XML,那么您可以选择使用内存映射...您尝试过吗?

      【讨论】:

        【解决方案5】:

        如果您计划在一个长期存在的应用程序中动态编译许多表达式,那么使用 XPath 可能不是一个好主意。

        我不完全确定 Java 版本的 XPath 是如何工作的,但是在 .NET XPath 中编译一个动态程序集,然后将它添加到应用程序域。表达式的后续使用查看现在加载到内存中的程序集。
        在一种情况下,我使用 XPath 会导致我认为这种相同类型的机制会减慢填充内存的速度,类似于内存泄漏。

        我的理论是,由于每个表达式都是使用来自用户的值编译的,因此每个编译的表达式都可能是唯一的,因此会编译一个新的表达式并将其添加到应用程序域中。
        由于您可以在不重新启动整个应用程序域的情况下从应用程序域中删除程序集,因此每次计算表达式时都会消耗内存并且无法恢复。结果,代码在内存中以程序集的形式泄漏内存,一段时间后,你就知道结果了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-06
          • 1970-01-01
          • 2014-05-23
          • 2020-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多