WriteStream nodejs出内存

WriteStream nodejs out memory

我尝试创建一个 20MB 的文件,但它抛出了内存不足的错误,将 max-old-space-size 设置为 2gb,但仍然有人可以向我解释为什么要写一个 20mb 的流这么耗内存?

我有 2.3 g.b 的空闲内存

let size=20*1024*1024; //20MB

for(let i=0;i<size;i++){
     writeStream.write('A')
}
writeStream.end();

node documentation所述,Writable将数据存储在内部缓冲区中。可以缓冲的数据量取决于传递给流的构造函数的 highWaterMark 选项。

只要缓冲数据的大小低于 highWaterMark,调用 Writable.write(chunk) 就会 return true。一旦缓冲数据超过 highWaterMark 指定的限制,它 returns false。这是您应该停止向 Writable 写入更多数据并等待 drain 事件表明现在可以继续写入数据的时间。

您的程序崩溃了,因为即使内部缓冲区已超过 highWaterMark,它仍继续写入。

查看有关 Event:'drain' 的文档。它包括一个示例程序。


这看起来是 Readable.pipe(Writable) 的一个很好的用例 您可以创建一个 return 字符的生成器函数,然后使用 Readable.from() 从该生成器创建一个 Readable。然后将 Readable 的输出通过管道传输到 Writable 文件。

这里使用管道有好处的原因是:

A key goal of the stream API, particularly the stream.pipe() method, is to limit the buffering of data to acceptable levels such that sources and destinations of differing speeds will not overwhelm the available memory. link

The flow of data will be automatically managed so that the destination Writable stream is not overwhelmed by a faster Readable stream. link

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