【问题标题】:parsing large xml 500M with node.js使用 node.js 解析大型 xml 500M
【发布时间】:2012-01-03 02:18:59
【问题描述】:

我正在使用isaacs' SAX 来解析一个巨大的 xml 文件。还有recommended by La Gentz

该进程使用了​​大约 650M 内存,我该如何减少这个或让节点使用更多。

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

我的 XML 文件大于 300M,它可以增长到 1GB。

【问题讨论】:

  • 听起来您需要在 php.ini 文件中允许更多内存使用。在您的 .ini 文件中查找 memory_limit 并更改值以允许您希望处理的最大文件。
  • 您是否尝试将 XML 文件保存为 JSON 文件?还是需要整个来将整个 Javascript 对象保存在内存中?
  • 我正在使用 node.js - 我找不到提高内存限制的参数。 (人节点,很多选项)
  • @DeaDEnD 我不需要整棵树。解析时出现错误:parser.write(file_buf.toString('utf8'), lenght).close();

标签: xml node.js sax


【解决方案1】:

您应该将文件流式传输到解析器中,毕竟这是流式解析器的全部意义所在。

var parser = require('sax').createStream(strict, options);
fs.createReadStream(file).pipe(parser);

【讨论】:

  • 如果您不想/不需要内存中的整个文档,这就是这样做的方法。 Node 实际上不是一个很好的解决方案,因为它是单线程的。因此,在解析这个庞大的文档时,该进程将无法做任何其他事情,例如响应 HTTP 请求。
  • @danmactough,你推荐使用什么?现在这个解决方案很棒,对我有用。我浏览了那个文件,让我的工人做一次性工作,这并不重要。
  • @DeaDEnD,谢谢。您或其他人是否知道如何在该解析器上发出结束信号,以便解析器停止并在解析时调用 parser.onend?
  • 您可以尝试调用readstream.destroy() 来阻止流读取文件,并尝试调用parser.end() 来通知解析器流已经结束。
  • @vik 如果您不关心阻塞,那么节点就可以了。您将从基于 c++ 的解析器之一中获得更好的性能—— sax.js 虽然很棒,但它是纯 javascript。不确定其他 xml 解析器是否提供 Stream 接口。
猜你喜欢
  • 2015-09-15
  • 2019-02-18
  • 2013-11-20
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多