2012-01-03 5 views
3

거대한 xml 파일을 구문 분석하려면 isaacs' SAX을 사용하고 있습니다. 또한 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

+0

XML 파일을 JSON 파일로 저장 하시겠습니까? 또는 전체 자바 스크립트 객체를 메모리에 유지해야합니까? – fent

+0

node.js를 사용하고 있습니다 - 메모리 제한을 높이기 위해 매개 변수를 찾을 수 없습니다. (맨 노드, 많은 옵션들이 있습니다.) – vik

답변

8

파일을 파서로 스트리밍해야합니다. 파서는 결국 스트리밍 파서의 전체 지점입니다.

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

전체 문서를 메모리에 넣고 싶지 않거나 필요로하지 않는 경우에 이렇게하는 방법이다. Node는 단일 스레드이므로 실제로는 큰 해결책이 아닙니다. 따라서이 엄청난 문서를 파싱하는 동안 프로세스는 HTTP 요청에 대한 응답과 같은 다른 작업을 수행 할 수 없습니다. – danmactough

+0

@danmactough, 무엇을 사용 하시겠습니까? 현재이 솔루션은 훌륭하고 저에게 효과적입니다. 나는 그 문서를 살펴보고 노동자가 일회 일하는 것을 허용한다. 그것은 중요하지 않다. – vik

+0

@DeaDEnD, 감사합니다. 당신이나 다른 사람들은 그 파서에서 끝 신호를 내보내는 법을 알고 있습니다. 그래서 파서는 멈추고 parser.onend는 파싱하는 동안 호출 될 것입니까? – vik