Node.js WriteStream节点输出内存
我试图创建一个20MB的文件,但它会将错误抛出内存,将最大旧空间大小设置为2gb,但仍有人能向我解释为什么写一个20MB的流会消耗这么多内存吗 我有2.3g.b的可用内存Node.js WriteStream节点输出内存,node.js,stream,createwritestream,Node.js,Stream,Createwritestream,我试图创建一个20MB的文件,但它会将错误抛出内存,将最大旧空间大小设置为2gb,但仍有人能向我解释为什么写一个20MB的流会消耗这么多内存吗 我有2.3g.b的可用内存 let size=20*1024*1024; //20MB for(let i=0;i<size;i++){ writeStream.write('A') } writeStream.end(); let size=20*1024*1024//20MB 对于(设i=0;i,如中所述,Writable将数据存
let size=20*1024*1024; //20MB
for(let i=0;i<size;i++){
writeStream.write('A')
}
writeStream.end();
let size=20*1024*1024//20MB
对于(设i=0;i,如中所述,Writable
将数据存储在内部缓冲区中。可缓冲的数据量取决于传递到流的构造函数中的highWaterMark
选项
只要缓冲数据的大小低于highWaterMark
,调用Writable.write(块)
将返回true
。一旦缓冲数据超过highWaterMark
指定的限制,它将返回false
。此时您应该停止向可写
写入更多数据,并等待drain
事件,该事件指示现在可以恢复写入数据
您的程序崩溃,因为即使内部缓冲区已超过highWaterMark
,它也会继续写入
检查有关的文档。它包括一个示例程序
这看起来像是一个很好的用例
您可以创建一个生成器函数,该函数返回一个字符,然后使用Readable.from()
从该生成器创建一个Readable
。然后通过管道将Readable
的输出传输到一个可写的
文件
在这里使用管道有益的原因是:
stream API的一个关键目标,特别是stream.pipe()方法,
将数据缓冲限制在可接受的水平,以便
不同速度的来源和目的地不会压倒
可用内存
及
数据流将自动管理,以便目标
可写流不会被更快的可读流淹没
我的问题是,在他们推荐使用stream.once('Drain')的文档中,第一种方法失败了,为了恢复流的写入,我发现异步发送数据也会起作用,@KevinMendoza,我刚刚编辑了我的答案来解释程序失败的原因。简而言之,数据在缓冲区中写入得更快,它能清空什么?这就是它失败的原因。@KevinMendoza,当您将数据从一个流传输到另一个流时,如果发送方比接收方快,发送的数据必须临时存储在某个地方。这个临时存储是缓冲区。所以我认为这不是为了加快进程,而是为了同步不同带宽的发送方和接收方。
const { Readable } = require('stream');
const fs = require('fs');
const size = 20 * 1024 * 1024; //20MB
function * generator(numberOfChars) {
while(numberOfChars--) {
yield 'A';
}
}
const writeStream = fs.createWriteStream('./output.txt');
const readable = Readable.from(generator(size));
readable.pipe(writeStream);