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);
我尝试创建一个 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);