【问题标题】:Reading very large gzip file stream in node.js在 node.js 中读取非常大的 gzip 文件流
【发布时间】:2021-01-07 08:54:28
【问题描述】:

我正在尝试在 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: Error -3 while decompressing: incorrect header check 建议通过 -zlib.Z_MAX_WINDOWBITSzlib.Z_MAX_WINDOWBITS|16 来纠正这个问题,但我试过了,这不是问题。

【问题讨论】:

  • 在问题中以十六进制形式提供前 20 个字节左右,以便我们查看它是否真的是一个 gzip 流。
  • 原来它确实不是 gzip 流。有一个同名的 json 文件包含关于我们的 gzip 文件的元数据,我们不小心没有指定扩展名。直到最近我们才获得了正确的文件,这纯属幸运,而直到最近几天我们才收到了 json 文件。只需指定扩展名即可解决问题。

标签: node.js gzip zlib node-streams


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2015-09-17
    • 2019-04-30
    相关资源
    最近更新 更多