繁体   English   中英

节点,缓冲区,流式传输,保存到文件

[英]Node, buffer, to stream, to saving to a file

我正在尝试获取一个文件(从S3作为Buffer返回),将其解压缩(这是一个流),然后将其保存到/tmp/foo磁盘上。

如果此脚本一次只能处理一个文件,即使我异步处理untar( zlib.gunzip() )函数也没有关系。 使用流有什么好处?

var getS3Args = { bucket: 'foo', key: 'bar.tar.gz' }

lib.getS3Object(getS3Args, function(getS3ObjectResponse) {
  zlib.gunzip(getS3ObjectResponse.Body, function(err, result) {
    if(err) return console.error(err);

    // ?

    console.log(result);
    return callback(result);
  });
});

您可以直接从aws-sdk获取S3中的数据流。 使用流时,您获得的好处是它使用更少的内存,因为它不需要整个缓冲区都在内存中进行操作。 流一次只在小块上运行,然后在处理这些块后将其收集为垃圾。 使用当前方法,如果您想从S3下载1TB Blob,则可能会出现内存不足错误,因为无法将整个缓冲区装入内存。 当使用流时,您可能永远不会看到正在使用的额外MB内存,因为一个块将从HTTP响应中消失,然后该块将被解压缩,解压缩并自己写入文件系统,而无需等待整个HTTP响应。

var AWS = require('aws-sdk')
var S3 = new AWS.S3()
var fs = require('fs')
var tar = require('tar')
var zlib = require('zlib')
var path = require('path')
var mkdirp = require('mkdirp')
var getS3Args = { bucket: 'foo', key: 'bar.tar.gz' }
var dest = '/path/to/destination'

S3.getObject(getS3Args)
  .createReadStream()
  .pipe(zlib.Unzip())
  .pipe(tar.Parse())
  .on('entry', function(entry) {
    var isDir     = 'Directory' === entry.type
    var fullpath  = path.join(dest, entry.path)
    var directory = isDir ? fullpath : path.dirname(fullpath)
    mkdirp(directory, function(err) {
      if (err) throw err
      if (!isDir) entry.pipe(fs.createWriteStream(fullpath))
    })
  })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM