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
文档源
奇怪的文档点,但它是迄今为止我见过的最好的
我正在尝试使用以下代码流式处理一个大文件(几 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
文档源奇怪的文档点,但它是迄今为止我见过的最好的