【问题标题】:gunzip partials read from read-stream从读取流中读取的 gunzip 部分
【发布时间】:2016-11-19 16:10:20
【问题描述】:

我使用Node.JS 从我的S3 存储桶中获取文件。 那边的文件是gzipped (gz)。

我知道每个文件的内容都是由行组成的,其中每一行是一些未能放在Kinesis上的记录的JSON

每个文件包含约 12K 的此类记录。并且我希望能够在下载文件时处理记录。

如果文件不是 gzipped,则可以使用streamsreadline 模块轻松完成。 所以,唯一阻止我这样做的是gunzip 进程,据我所知,它需要在整个文件上执行。

有没有办法gunzipping文件的一部分?

谢谢。


编辑 1:(不好的例子)

尝试@Mark Adler 的建议:

  const fileStream = s3.getObject(params).createReadStream();
  const lineReader = readline.createInterface({input: fileStream});

  lineReader.on('line', line => {
    const gunzipped = zlib.gunzipSync(line);
    console.log(gunzipped);
  })

我收到以下错误:

错误:标头检查不正确 在 Zlib._handle.onerror (zlib.js:363:17)

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 stream gzip


    【解决方案1】:

    是的。 node.js 有一个complete interface to zlib,它允许您一次解压缩尽可能多的 gzip 文件。

    【讨论】:

    • 你能分享一个如何做这件事的例子吗?该网页没有记录。请查看我的编辑。
    • 感谢@Mark 的提醒,我已经通过一个工作示例发布了更详细的答案。
    【解决方案2】:

    解决上述问题的工作示例

    以下解决了上面代码中的问题:

      const fileStream = s3.getObject(params).createReadStream().pipe(zlib.createGunzip());
      const lineReader = readline.createInterface({input: fileStream});
    
      lineReader.on('line', gunzippedLine => {
        console.log(gunzippedLine);
      })
    

    【讨论】:

      猜你喜欢
      • 2020-12-24
      • 2012-01-03
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2011-03-01
      相关资源
      最近更新 更多