如何在Node.js中读取超过1GB的tar.gz文件?

12

我以前从未这样做过,所以这可能是非常基础的事情,但我还是想问一下。

在 Node.js 中读取非常大的文件的正确方法是什么?假设文件太大而无法一次性读取完。另外,假设文件可能会以 .zip.tar.gz 格式存在。

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

然后主要问题是,如何在 Node.js 中读取这个大文件?假设它是一个 1GB 的 XML 文件,在解析它之前应该从哪里开始查找?(不是如何解析 XML,而是如果你按行读取大文件,如何解析类似于需要知道前几行上下文的 XML 文件)。

我看到了fs.createReadStream,但我害怕瞎搞... 不想让电脑爆炸。只是想要一些正确方向的指针。


2
你想用它做什么? - Jeremy Rodi
假设这是一个非常大的 CSV 文件,我只想为每一行创建一个数据库记录。 - Lance
你有两个问题,1. 是否有适用于Node的流式zip文件阅读器,2. 是否有流式XML阅读器(可以使用第一个流作为输入)。不确定有哪些选项,但这可能会帮助你搜索... - Joe
2个回答

9

Node.js 中有内置的 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);

如果我想压缩一个包含几GB数据的目录,应该怎么做? - Vaibhav Pachauri
你需要立即处理那个zip文件还是只是想压缩并保存?我可能会生成tar + gz子命令。 - Andrey Sidorov
我只需要将目录压缩并保存。对于Node.js,我是新手,对于spawn tar+gz并不太熟悉。 - Vaibhav Pachauri
明白了。我已经发布了答案。谢谢,伙计 :) - Vaibhav Pachauri

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

这很好地解决了问题 :)

老而弥坚! - loretoparisi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接