Nodejs未压缩的gz只包含一行

Nodejs uncompressed gz contains only one line

我正在尝试使用以下代码流式处理一个大文件(几 GB),但它只输出未压缩文件的第一行。

const instream = fs.createReadStream('logs.gz');
const unzip = zlib.createGunzip();
const outstream = process.stdout;

instream.pipe(unzip).pipe(outstream);
// <first line of file>>

我没有压缩文件,但从日志提供程序的 API 文档来看,它应该是 gunzipped。

如果我使用 7zip 手动解压,解压效果很好。如果我随后再次使用 7zip 压缩它,代码将在这个 7zip 处理文件上按预期工作。

如果我钩住 unzip 流的 error|finish|data 事件,没有错误,数据打印一行,然后完成。有什么线索可能是错的吗?

也试过createUnzip

Win10 上的节点 5.5.0,MacOSX 节点 v5.6.0 上的行为相同。

这与您使用的 Node 版本有关:在 Node v5.9.0 之前,zlib 无法正确处理包含多个 gzip 块的文件。对于这些文件,只有第一个块会被解压。

为了重现这个问题,我使用以下方法创建了一个包含多个块的文件:

$ echo foo | gzip > logs.gz
$ echo bar | gzip >> logs.gz

我猜你的日志文件是以类似的方式创建的,其中每个日志行都被单独压缩并附加到压缩的日志文件中。

可能唯一合理的解决方案是至少升级到 v5.9.0(或 v6,甚至)。

如果您想要一个好的 'one-page' 7zip

文档源

NRAO.edu

奇怪的文档点,但它是迄今为止我见过的最好的