gpt4 book ai didi

node.js - Node 、缓冲区、流式传输、保存到文件

转载 作者:搜寻专家 更新时间:2023-11-01 00:39:35 24 4
gpt4 key购买 nike

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

如果此脚本一次只能处理一个文件,那么我异步处理解压 (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 中的数据流。使用流时获得的优势是它使用更少的内存,因为它不需要在内存中拥有整个缓冲区来对其进行操作。流一次对小块进行操作,然后这些 block 在处理后会被垃圾收集。使用您当前的方法,如果您想从 S3 下载 1TB 的 blob,您可能会遇到内存不足的错误,因为您无法将整个缓冲区放入内存。当使用流时,你可能永远不会看到超过几 MB 的额外内存被使用,因为一个 block 将从 HTTP 响应中下来,然后该 block 将被解压缩、解压缩并自行写入你的文件系统,而无需等待对于整个 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))
})
})

关于node.js - Node 、缓冲区、流式传输、保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39436943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com