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


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

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

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

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

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


8105
2018-06-18 02:20


起源

你想用它做什么? - Jeremy Rodi
怎么样,假设它是一个非常大的CSV,我只想为每一行创建一个数据库记录。 - Lance Pollard
您有两个问题,1。是否有针对Node的流式zip文件阅读器,以及2.是否有流式XML阅读器(可以使用第一个流作为输入)。不知道那里有什么选项,但这可能有助于你搜索... - Joe


答案:


有内置的 zlib的 流解压缩和模块 萨克斯 用于流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);

9
2018-06-18 04:35



如果我想要压缩包含GB数据的目录,我该怎么办? - Vaibhav Pachauri
你需要立即处理该拉链还是只想拉链并保存?我可能只是生成tar + gz child命令 - Andrey Sidorov
我只需要压缩目录并保存。我对Node.js不是新手,我对spawn tar + gz不太熟悉:\ - Vaibhav Pachauri
得到它了。也发了一个答案。谢了哥们 :) - Vaibhav Pachauri


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

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

这很好用:)


1
2018-04-05 09:41