【问题标题】:Parsing time for a large XML document in PerlPerl 中大型 XML 文档的解析时间
【发布时间】:2014-04-10 01:47:30
【问题描述】:

我有一个包含大约 150 万行的大型 XML 文件。 文件的基本骨架是

<org>
   <dept>
      <emp> ... </emp>
      <emp> ... </emp>
      ...
   </dept>
</org> 

每个&lt;emp&gt; 节点甚至可以有多达80 万行

我需要解析整个数据并将其保存在哈希中。

我尝试过使用XML::Simple(我不允许使用其他模块,例如XML::Twig 或XML::libXML)。

问题在于解析整个文件大约需要 5.5 分钟。我需要将它降低到 30 秒左右。

我尝试将其拆分为多个文件,每个文件包含一个 &lt;emp&gt; .. &lt;/emp&gt; 部分。例如,我有大约 100 个文件。

然后我使用fork 并使用 100 个子进程来解析每个文件。

我将总时间减少到 1.5 分钟左右,但我还没有找到一些方法将数据从子进程传回父进程。

【问题讨论】:

  • 我必须用XML 做一次,到目前为止最快的方法是使用XML::LibXML,它是CPAN,但是由于依赖关系可能或应该已经安装的那些模块之一。
  • 什么是“多达80万行”?您的意思是“少于 800,000 行”吗?
  • 请解释一下“我需要解析并保存hash ref中的全部数据”。这是一个非常具体的要求,几乎可以肯定是不必要的
  • 是的..我的意思是每个 &lt;emp&gt; 节点可以包含大约 800,000 行。
  • 没有理由将所有可能被访问的东西都保存在内存中。例如,谷歌在四分之一秒内返回了我对Chosera stone 的查询,我确信它不会在内存中保留所有互联网的索引。任何指示你瞄准 30 秒的人都应该被枪杀,因为你的目标是一个我怀疑无法实现的荒谬理想

标签: xml perl parsing fork


【解决方案1】:

最明显的解决方案是使用XML::Twig,它是为这样的目的而设计的。它允许您声明在规定的 XML 元素关闭时调用的回调子例程,并且不会尝试将完整的结构读入内存。

如果没有适当的数据样本,我将无能为力,但您似乎会为 dept 和 emp 元素声明回调。

【讨论】:

  • 谢谢。但是我不应该使用 CPAN 模块 - 相反,如果需要,我被建议编写自己的特定于此要求的解析器​​。
  • @Soumya:你的雇主到底在想什么,你说的“不应该使用CPAN模块”是什么意思?没有strict 和warnings,你不会走得太远。 CPAN 上只有少数几个模块可以正确解析 XML,并且已经过社区的彻底测试。编写可靠且可用的代码需要花费数年时间大量 的工作。你应该自己写一些东西吗?我会在 5 人的团队中引用他们两年,或者提供给他们 XML::Twig 及其依赖项,并说你自己写的
  • @Soumya:请记住,CPAN 模块使用 XS,这是 Perl 的中间语言,允许用 C 编写关键代码片段。除非你自己开始编写 XS 模块,这远非简单
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2015-05-16
  • 2012-08-12
  • 2020-10-16
  • 2020-07-10
相关资源
最近更新 更多