【问题标题】:Fast way of loading large corpus of xml files?加载大量 xml 文件的快速方法?
【发布时间】:2014-07-07 02:30:50
【问题描述】:

我有大量的 xml 文件(约 20,000 个文件)。当我加载整个语料库时,加载每个文档大约需要 1 秒。 xml相当大。 (> 10,000 行)。每个 xml 代表一个文档,其中包含句子节点、句子中的标记和其他类似属性。

我在 java 中使用 DocumentBuilder 来加载 xml。加载xml后,我还需要提取一些相关的xml节点(大约100句话)。为此,我使用了 getElementsByTagName()。

有没有更快的方法在 java 中加载 xml 文档?

【问题讨论】:

  • 你的意思是加载xml?没有其他的。我正在考虑使用 lucene 索引 xml 文档,但想知道是否有替代方法。
  • 我相信与 JSON 和 YAML 相比,XML 是加载效率最高的文件格式,至于实际加载为什么不尝试多种方法并做一些基准测试?
  • 多种方法是指在 Java 中使用其他 XML 库?
  • 考虑学习 XSLT,特别是如果它可以流式传输。
  • @Unihedron,反过来说,JSON 解析器通常比 XML 更快。

标签: java xml lucene


【解决方案1】:

您可以考虑使用 SAX 实现。基于此链接,SAX 通常快 2 到 5 倍:http://dublintech.blogspot.be/2011/12/jaxb-sax-dom-performance.html。当您只需要实际处理文档的一部分而不是所有内容时,这很有意义。

您还可以使用更快的磁盘,例如 SSD,或者可以使用具有缓存策略的虚拟文件系统。

如果您的磁盘速度较慢,甚至可以将它们全部压缩到一个大 zip 中,这将减少 80% 到 90% 的磁盘访问。解压缩开销应该被磁盘访问性能的提升所抵消。

但是说您也在考虑使用 Lucene 实际上意味着我们缺少一些关于您的用例的关键信息,因为这意味着您正在优化的操作或多或少是“一次性”的。

如果您确实只需要文档内容中相对较小的一部分,您还可以考虑将这些信息存储在一个数据结构中并对其进行序列化。这样,您只需要反序列化一个文件,而不需要处理 20.000 个 XML 文档。如果文档发生更改,您还可以存储文档路径和像 MD5 这样的哈希码来检测修改的文档。

【讨论】:

  • “因为这意味着您正在优化的操作或多或少是‘一次性’”我不明白那部分。如果需要,我可以添加有关我的用例的更多信息。
  • 基本问题是:您是否在应用程序启动期间执行过一次?如果是这样,并且假设应用程序将运行很长时间(例如,对于网络服务器来说是几周),那么过于努力地优化可能不是一个好主意。注意:我添加了一个替代解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2013-04-25
  • 1970-01-01
  • 2016-06-29
  • 2010-11-28
相关资源
最近更新 更多