12

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

在 Node.js 中读取一个非常大的文件的正确方法是什么?假设文件太大而无法一次读取。还说文件可以以 a.zip.tar.gz格式出现。

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

那么主要问题是,如何在 Node.js 中读取这个大文件?假设它是一个 1GB 的 XML 文件,我应该从哪里开始解析它?(不是,如何解析 XML,但如果您正在逐行读取大文件,您如何解析需要了解前几行上下文的 XML 之类的内容)。

我见过fs.createReadStream,但我害怕乱来......不想爆炸我的电脑。只是在正确的方向上寻找一些指示。

4

2 回答 2

9

有用于流解压的内置zlib模块和用于流 XML 解析的sax

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);
于 2012-06-18T04:35:27.220 回答
2

我们还可以压缩目录,如下所示:

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

这很好用:)

于 2016-04-05T09:41:30.353 回答