2012-01-03 133 views
3

我正在使用isaacs' SAX解析一个巨大的XML文件。也recommended by La Gentz用node.js解析大型XML 500M

该过程使用大约650M的内存,我该如何减少这个或允许节点使用更多。

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory 

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

+0

听起来像你需要考虑更多的内存使用在你的php.ini文件。在.ini文件中查找“memory_limit”并更改该值以允许您希望处理的最大文件。 – Aaron 2012-01-03 02:44:28

+0

您是否试图将XML文件另存为JSON文件?还是你需要整个把整个Javascript对象保存在内存中? – fent 2012-01-03 03:11:57

+0

我正在使用node.js - 我找不到提高内存限制的参数。 (人节点,很多的选项) – vik 2012-01-03 03:12:03

回答

8

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

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

这是如果你不想/需要整个文档在内存中的方法。实际上Node并不是一个很好的解决方案,因为它是单线程的。因此,在解析这个庞大的文档时,该流程将无法执行其他任何操作,例如响应HTTP请求。 – danmactough 2012-01-03 11:57:14

+0

@danmactough,你会推荐使用什么?目前这个解决方案非常棒,适合我。我浏览那份文件,让我的工作人员做一次性工作,这并不重要。 – vik 2012-01-03 13:03:17

+0

@DeaDEnD,谢谢。您或其他人是否知道如何在该解析器上发出结束信号,因此解析器停止并解析器.onend会在解析时调用? – vik 2012-01-03 13:06:09