Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js WriteStream节点输出内存_Node.js_Stream_Createwritestream - Fatal编程技术网

Node.js WriteStream节点输出内存

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将数据存

我试图创建一个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
将数据存储在内部缓冲区中。可缓冲的数据量取决于传递到流的构造函数中的
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);