在 Java 中读取 BIG XML 文件的一小部分的有效方法
Posted
技术标签:
【中文标题】在 Java 中读取 BIG XML 文件的一小部分的有效方法【英文标题】:Efficient way to read a small part of a BIG XML file in Java 【发布时间】:2012-08-20 08:51:58 【问题描述】:我们有一个新要求:
有一些 BIG xml 文件不断进入我们的系统,我们需要立即使用 Java 快速处理它们。该文件很大,但我们处理所需的信息在一个非常小的元素内。 ... ...
在我们开始处理之前,从大文件中提取这小部分数据的最佳方法是什么?如果我们尝试加载整个文件,由于大小,我们将立即出现内存不足错误。 Java 中的有效方法是什么,我可以使用它来获取 ..data..data..data.. 数据元素,而无需逐行加载或读取文件。是否有任何 SAX 解析器可以用来完成这项工作?
谢谢
【问题讨论】:
【参考方案1】:SAX 解析器是基于事件的,并且速度更快,因为它们可以满足您的需求:它们不会完全读取 xml 文档。 Java 发行版中有一个SAXParser
。
【讨论】:
找到感兴趣的部分后,您推荐的停止解析的方法是什么?恕我直言,SAX 使用的回调模型并不适合。 我必须同意这一点。仔细定义处理程序方法(高效且最少的代码)也很重要,否则您最终可能会构建一个不比基于 DOM 的解决方案好多少。 我认为 XMLStreamReader (StAX) 可能更适合这里。由于它为您提供了一个迭代器,因此您可以循环直到找到您要查找的内容,阅读它,然后关闭阅读器。【参考方案2】:我不得不在以前的项目 (1G-2G) 中解析大文件,并且不想使用 SAX。我发现 SAX 在某些情况下太低级,并且在大多数情况下喜欢保持遍历方法。
我使用了 VTD 库 http://vtd-xml.sourceforge.net/。这是一个非常快速的库,使用指针在文档中导航。
【讨论】:
【参考方案3】:好吧,如果您想读取文件的一部分,您将需要读取文件的每一行,以便能够识别感兴趣的文件部分,然后提取您感兴趣的部分需要。
如果您只需要传入 XML 的一小部分,您可以使用 SAX,或者如果您只需要读取特定的元素或属性,您可以使用 XPath,这将更容易实现。
Java 带有一个内置的 SAXParser 实现以及一个 XPath 实现。查找 SAXParser here 和 XPath here 的 javadocs。
【讨论】:
XPath 在向下钻取路径时会将内容保留在内存中吗? @MiserableVariable Java 的内置 XPath 实现接受 DOM 元素(如 Document、Node 等)以及 InputSource 对象(由 SAX 支持)。所以这取决于你如何使用它。 @Alex 考虑到自 Java 5 以来任何链接类都没有变化,链接的文档版本是否重要?【参考方案4】:StAX 是另一种基于流数据的选项,如 SAX,但受益于更友好的方法 (IMO) 通过“拉”您想要的而不是“推”给您来处理数据。
【讨论】:
以上是关于在 Java 中读取 BIG XML 文件的一小部分的有效方法的主要内容,如果未能解决你的问题,请参考以下文章