首页 > 解决方案 > 在 node.js 中读取非常大的 gzip 文件流

问题描述

我正在尝试在 node.js 中读取一个非常大的 gzipped csv 文件。到目前为止,我一直在使用 zlib:

file.createReadStream().pipe(zlib.createGunzip()

是我传递给 Papa.parse 的流。这适用于大多数文件,但它会因非常大的 gzip CSV 文件(250 MB,解压缩到 1.2 GB)而失败,并引发此错误:

Error: incorrect header check
     at Zlib.zlibOnError [as onerror] (zlib.js:180:17) {
   errno: -3,
   code: 'Z_DATA_ERROR'
 }

本来我以为是文件的大小导致了错误,但现在我不太确定了;可能是因为文件已使用不同的算法加密。zlib.error: 解压时出现错误 -3:不正确的标头检查建议通过-zlib.Z_MAX_WINDOWBITSzlib.Z_MAX_WINDOWBITS|16纠正它,但我试过了,这不是问题。

标签: node.jsgzipzlibnode-streams

解决方案


尽管绝对确定我们有一个 gzip 流,但事实证明我们没有。我们从一个 AWS S3 存储桶中获得了这个文件,该存储桶包含这个文件的许多版本,具有不同的时间戳。因此,我们根据前缀选择文件并仅加载最新的文件。

但是,S3 存储桶还包含带有有关这些文件的元数据的 json 文件。长期以来,我们总是得到 gzip 而不是 json,这纯粹是运气,而最近这种运气动摇了。所以我们总是得到一个 gzip 文件,这次我们得到了一个 json。

标头检查错误是完全正确的:我们正在查看的文件不是我们认为的 gzip 文件,因此它没有正确的标头。

将这个答案留在这里而不是删除问题,因为将来遇到此错误的人总是有可能绝对确定他们正在压缩正确的文件,而实际上并非如此。仔细检查您正在加载的文件。


推荐阅读