我正在尝试使用以下代码对大文件(几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文档中,它应该被压缩。
如果我使用7zip手动解压缩,它会解压缩。如果我再用7zip压缩它,代码就会在这个7zip处理文件上按预期工作。
如果我挂钩error
流的finish
| data
| unzip
事件,没有错误,数据会打印一行然后结束。什么可能是错的线索?
也试过createUnzip
。
Win10上的节点5.5.0,MacOSX节点v5.6.0上的相同行为。
答案 0 :(得分:1)
它与您正在使用的Node版本有关:在Node v5.9.0之前,zlib
没有正确处理包含多个gzip压缩块的文件。使用这些文件,只会对第一个块进行解压缩。
要复制此问题,我使用以下内容创建包含多个块的文件:
$ echo foo | gzip > logs.gz
$ echo bar | gzip >> logs.gz
我的猜测是您的日志文件是以类似的方式创建的,其中每个日志行都是单独压缩并附加到压缩日志文件中。
可能唯一合理的解决方案是升级到至少v5.9.0(或v6,偶数)。
答案 1 :(得分:0)