总的来说,我看不到任何会破坏您代码的东西。
两个建议:
合并
Buffer对象的方式不是最佳选择,因为它必须在每个“数据”事件上复制所有预先存在的数据。最好将大块放在一个数组中,然后将
concat它们全部放在最后。
var bufs = [];stdout.on('data', function(d){ bufs.push(d); });stdout.on('end', function(){ var buf = Buffer.concat(bufs);}为了提高性能,我将调查您使用的S3库是否支持流。理想情况下,您根本不需要创建一个大缓冲区,只需将
stdout流直接传递到S3库即可。
至于问题的第二部分,那是不可能的。调用函数时,将为其分配自己的私有上下文,并且只能从该函数内定义的其他项访问该函数内定义的所有内容。
更新资料
将文件转储到文件系统可能会减少每个请求的内存使用量,但是文件IO可能非常慢,因此可能不值得。我想说,除非可以对此功能进行概要分析和压力测试,否则不要进行过多优化。如果垃圾收集器正在执行其工作,则可能是过度优化了。
综上所述,总有更好的方法,所以不要使用文件。由于所需的只是长度,因此您可以计算该长度而无需将所有缓冲区附加在一起,因此根本就不需要分配新的Buffer。
var pause_stream = require('pause-stream');// Your other pre.var bufs = [];stdout.on('data', function(d){ bufs.push(d); });stdout.on('end', function(){ var contentLength = bufs.reduce(function(sum, buf){ return sum + buf.length; }, 0); // Create a stream that will emit your chunks when resumed. var stream = pause_stream(); stream.pause(); while (bufs.length) stream.write(bufs.shift()); stream.end(); var headers = { 'Content-Length': contentLength, // ... }; s3.putStream(stream, ....);


