2012-07-06 4 views
0

거대한 로그 파일 (250,000 줄)을 읽고 각 줄을 JSON 객체로 구문 분석하고 각 JSON 객체를 분석을 위해 CouchDB에 삽입하려고합니다.Node.js : 메모리 부족없이 스트림 처리

각 덩어리를 별도로 처리하는 버퍼링 된 스트림을 만들어서이 작업을 시도하고 있지만 약 300 줄 이후에 항상 메모리가 부족합니다. buffered streamsutil.pump을 사용하는 것은 피해야하지만 외관상으로는 그렇지 않습니다.

(아마도이 ​​Node.js를하고 CouchDB를보다 이것에 대한 더 나은 도구입니다,하지만 난 Node.js를에서 파일 처리의이 종류의 일을하고 그것이 가능해야한다고 생각하는 방법을 학습에 관심이 있어요.)

여기 아래에 커피 스크립트, 자바 스크립트 : https://gist.github.com/5a89d3590f0a9ca62a23

fs = require 'fs' 
util = require('util') 
BufferStream = require('bufferstream') 

files = [ 
    "logfile1", 
] 

files.forEach (file)-> 
    stream = new BufferStream({encoding:'utf8', size:'flexible'}) 
    stream.split("\n") 
    stream.on("split", (chunk, token)-> 
    line = chunk.toString() 
    # parse line into JSON and insert in database 
) 
    util.pump(fs.createReadStream(file, {encoding: 'utf8'}), stream) 
+1

스트림을 사용하여 파일을 피드에 제공 할 수 있어야합니다. '데이터'이벤트에서 스트림을 일시 중지 한 다음 각 청크를 "\ n"로 분할 할 수 있습니다. "\ n"으로 끝나지 않는 경우 다음 덩어리의 분할에서 마지막 항목을 유지합니다. "end"이벤트가 발생하면 나머지를 처리해야합니다. bufferstream을 사용하면 메모리가 부족해 지므로 파일을 메모리의 버퍼 배열로 옮겨야합니다. 또한 util.pump() 대신 stream.pipe()를 사용해야합니다. –

+0

fs.createReadStream() - http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options –

+1

을 사용하는 것이 좋습니다. [https://github.com/nickewing/line-reader](https) : //github.com/nickewing/line-reader) – inf3rno

답변