2013-07-02 1 views
1

노드에서 응용 프로그램의 로그 파일을 처리하는 중이고 트래픽 볼륨으로 인해 매일 크기가 기가 바이트가 될 수 있습니다.노드에서 큰 구분 된 텍스트 파일을 구문 분석하는 방법

파일은 매일 밤 파고 들며 디스크에 압축을 풀지 않아도 파일을 읽어야합니다.

zlib을 사용하여 스트림의 일부 형식으로 파일 압축을 풀 수 있지만 데이터를 가져 오는 방법을 알지 못하고 한 번에 한 줄씩 쉽게 처리 할 수있는 방법을 알지 못합니다. \ n을 검색 루프가 포함됩니다 동안의 어떤 종류를 알고있다.

를 내가 찾은 가장 가까운 답은 지금까지 입증 된 방법 파이프 SAX 파서에 스트림을, 그러나에 전체 노드 파이프/스트림은 조금 혼란

입니다
fs.createReadStream('large.xml.gz').pipe(zlib.createUnzip()).pipe(saxStream); 
+0

는 네이티브 확장을 작성하고 C++ 라이브러리를 사용하여 생각 해 봤나 도움이되기를 바랍니다? 파일 크기가 클 경우이 옵션이 가장 좋습니다 ... – ChrisCM

+0

잘 모르겠 음 C++ tbh. 현재 파일을 압축 해제 한 다음 마감일을 사용하여 작업을 수행 할 수 있지만 프로덕션 환경으로 롤백하면 사용 권한이 잠겨 로그 폴더의 내용을 변경할 수없고 읽기만 가능합니다. –

+0

sudo를 사용하여 노드 프로세스를 실행 해보십시오. – ChrisCM

답변

0

sax을 참조하십시오. isaacs가 개발했습니다.

이 코드를 테스트하지는 않았지만이 줄을 따라 뭔가를 작성합니다.

var Promise = Promise || require('es6-promise').Promise 
, thr = require('through2') 
, createReadStream = require('fs').createReadStream 
, createUnzip = require('zlib').createUnzip 
, createParser = require('sax').createStream 
; 

function processXml (filename) { 
    return new Promise(function(resolve, reject){ 
    var unzip = createUnzip() 
    , xmlParser = createParser() 
    ; 

    xmlParser.on('opentag', function(node){ 
     // do stuff with the node 
    }) 
    xmlParser.on('attribute', function(node){ 
     // do more stuff with attr 
    }) 

    // instead of rejecting, you may handle the error instead. 
    xmlParser.on('error', reject) 
    xmlParser.on('end', resolve) 

    createReadStream(filename) 
    .pipe(unzip) 
    .pipe(xmlParser) 
    .pipe(thr(function(chunk, enc, next){ 
     // as soon xmlParser is done with a node, it passes down stream. 
     // change the chunk if you wish 
     next(null, newerChunk) 
    })) 

    rl = readline.createInterface({ 
     input: unzip 
    , ouput: xmlParser 
    }) 
    }) 
} 

processXml('large.xml.gz').then(function(){ 
    console.log('done') 
}) 
.catch(function(err){ 
    // handle error. 
}) 

나는 그

관련 문제