nodejs 에서 대용량 xml 파일 파싱하기

Posted by Everyharu
2016.12.14 14:15 IT/NodeJS

nodejs 는 정말 편리한 언어이다.

쓰레드풀이 미리 정해져 있어 쓰레드를 만드는 과정을 굳이 거치지 않아도 많은 부분이 쓰레드로 동작한다.

물론 쓰레드풀이 있다고 해서

여러개의 프로세스코어를 사용한다는 말은 아니지만 말이다.


아무튼 콜백헬과 같은 문제들도 어느정도 언어의 진화를 통해 극복해가고 있고 그렇지 않더라도 asyncjs 와 같은 솔루션들로 인해

사랑받는 언어가 되었음은 두말할것도 없다.


때문에 여러가지 공개된 오픈소스 라이브러리가 많은것은 두말하면 잔소리일 것이다.

필자도 2GB정도의 xml 파일을 파싱할일이 생겼는데 이를 한번에 불러오는건 만만치 않은 작업이다.

기본적으로 노드 변수 하나의 buffer 에 이정도로 큰 사이즈를 올리는것도 무리라면 무리지만 기본세팅으로는 되지도 않는다.

이를 극복하기 위해 xml 파서들을 찾아보았지만 이런 대용량에 맞게 설계된 경우는 stream 을 지원하는 방식이어야 한다.

이렇게 해서 찾은것이 xmlStream 이라는 패키지였다.


공개된 오픈소스 Github 페이지

https://github.com/assistunion/xml-stream



설치방법

npm install xml-stream --save


사용방법

예시가 되는 xml 파일

<item id="123" type="common">

  <title>Item Title</title>

  <description>Description of this item.</description>

  (text)

</item>

파싱 스크립트

var fs = require('fs');

var XmlStream = require('xml-stream');

var stream=fs.createReadStream('Y:/file.xml');

var xml = new XmlStream(stream);

xml.on('endElement:item', function(item) {

console.log(item);

});

결과값

{ title: 'Item Title',

  description: 'Description of this item.',

  '$': { id: '123', type: 'common' },

  '$text': '\\ \\ \\ (text)\\' }




간단하게 말해서 파일을 스트림으로 읽어서 순차적으로 파싱된 결과를 출력하는것이다.

위의 스크립트에서 stream 을 그대로 XmlStream으로 넘겨주었고 이를 통해 event 방식으로 이후 처리가 일어난다.

endElement:item 이란것은 각 xml의 엘레먼트가 끝났을 때마다 체크를 하되 item 이라는 이름을 가진 tag에서 출력한다는 것이다.

item 태그 단위로 묶여있다면 item 단위로 출력되는것이고 때문에 스트림방식으로 이용하여 파싱할 수 있는것이다.



이외에도 다른 이벤트들이 있지만 주로 사용하게 될 파싱방법은 위와같은 형식이 되리라고 생각한다.

다른 이벤트들이 궁금하다면 github 페이지를 참조하기 바란다.


이 댓글을 비밀 댓글로