2012-06-18 4 views
11

전에 이런 일을 한 적은 없었으므로 어쨌든 물어볼 것이라고 생각했습니다.Node.js에서 매우 큰 (> 1GB) tar.gz 파일을 읽는 방법은 무엇입니까?

Node.js에서 매우 큰 파일을 읽는 올바른 방법은 무엇입니까? 파일이 너무 커서 한 번에 모두 읽을 수 없다고 가정 해보십시오. 파일이 .zip 또는 .tar.gz 형식으로 제공 될 수도 있습니다.

첫 번째 질문은 파일 압축을 풀고 디스크에 저장하는 것이 가장 좋습니다 (지금 Mac에서 Stuffit을 사용하고 있습니다). 그런 다음 해당 파일을 사용 하시겠습니까? 또는 압축 된 .zip 또는 .tar.gz 버전에서 곧바로 IO 스트림을 읽을 수 있습니까? 압축 된 파일에서 내용의 형식을 알아야 할 필요가 있으므로 압축을 풀어야합니다 (이 .tar.gz 파일이 실제로는 .dat 파일임을 알았습니다) ...

그런 다음 주요 문제는 다음과 같습니다. Node.js에서이 큰 파일을 읽으려면 어떻게해야합니까? 1GB XML 파일이라고 가정 해 봅시다. 구문 분석을 시작할 때 어디에서보아야합니까? XML을 파싱하는 방법은 아니지만 큰 파일을 한 줄씩 읽는다면 이전 줄의 컨텍스트를 알아야하는 XML과 같은 구문을 어떻게 파싱해야합니까?

나는 fs.createReadStream을 보았지만 주위를 어지럽히는 것이 두려워 ... 내 컴퓨터를 폭발하고 싶지는 않습니다. 그냥 올바른 방향으로 몇 가지 포인터를 찾고.

+2

무엇을하고 싶습니까? –

+0

어쨌든 매우 큰 CSV라고 가정하고 각 행에 대해 데이터베이스 레코드를 만들고 싶습니다. –

+0

두 가지 문제가 있습니다. 1. Node 용 스트리밍 Zip 파일 판독기가 있습니까? 2. 스트리밍 XML 판독기 (첫 번째 스트림을 입력으로 사용할 수 있음)가 있습니까? 어떤 옵션이 있는지 알지 못하지만 검색하면 도움이 될 것입니다 ... – Joe

답변

9

가 내장되어

var fs = require('fs'); 
var zlib = require('zlib'); 
var sax = require('sax'); 

var saxStream = sax.createStream(); 
// add your xml handlers here 

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

GB의 데이터가 포함 된 디렉토리를 압축하려면 어떻게해야합니까? –

+0

즉시 해당 우편 번호를 처리해야하거나 우편 번호를 저장하고 저장해야합니까? 난 그냥 타르 + GZ 자식 명령을 산란거야 –

+0

난 그냥 디렉터리를 지퍼를 저장해야합니다. 나는 Node.js에 조금 익숙하지 않다. 나는 tar + gz의 생성에 익숙하지 않다. \ –

1

우리는 또한 다음과 같은 디렉토리 뭔가 압축 할 수 있습니다 구문 분석 zlib 스트림 압축 해제 모듈과 스트림 XML에 대한 sax :

var spawn = require('child_process').spawn; 
var pathToArchive = './very_large_folder.tar.gz'; 
var pathToFolder = './very_large_folder'; 

var tar = spawn('tar', ['czf', pathToArchive, pathToFolder]); 
tar.on('exit', function (code) { 
     if (code === 0) { 
       console.log('completed successfully'); 
     } else { 
       console.log('error'); 
     } 
}); 

이 멋지게 일을 :)

관련 문제