Node.js:如何将流读入缓冲区?

Node.js:如何将流读入缓冲区?,第1张

Node.js:如何将流读入缓冲区

总的来说,我看不到任何会破坏您代码的东西。

两个建议:

合并

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, ....);


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/5088044.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-16
下一篇2022-11-16

发表评论

登录后才能评论

评论列表(0条)

    保存