如何在Node.js中读取非常大(> 1GB)的tar.gz文件?

时间:2012-06-18 02:20:10

标签: javascript file node.js file-io filestream

我以前从来没有这么做过,所以这可能是非常基本的东西,但我想我还是会问。

在Node.js中读取非常大的文件的正确方法是什么?假设文件太大而无法一次读取。另请说该文件可以.zip.tar.gz格式输入。

第一个问题,最好首先解压缩文件并将其保存到磁盘(我现在在Mac上使用Stuffit来执行此操作),然后使用该文件?或者您可以直接从压缩的.zip.tar.gz版本中读取IO流吗?我想你需要知道压缩文件中内容的格式,所以你可能需要解压缩(刚发现这个.tar.gz文件实际上是.dat文件)...

然后主要问题是,如何在Node.js中读取这个大文件?假设它是一个1GB的XML文件,我应该在哪里开始解析它? (不是,如何解析XML,但是如果你逐行读取大文件,你如何解析像XML这样需要知道前一行上下文的东西。)

我见过fs.createReadStream,但我不敢乱用它......不想爆炸我的电脑。只是寻找正确方向的一些指示。

2 个答案:

答案 0 :(得分:9)

内置zlib模块用于流解压缩,sax用于流XML解析

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);

答案 1 :(得分:1)

我们还可以将目录压缩如下:

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');
        }
});

这很好用:)