在Node.js中使用流写入大量数据

问题描述

使用Node.js中的流编写器,编写一个Node.js代码以在文件中写入字符串“ Hello world” 10 ^ 5次。

我尝试使用循环,但是没有内存不足错误,系统挂起。

还有更好的方法吗?

var fs = require('fs');
var wstream = fs.createWriteStream('D:\\myOutput.txt');
for(var i=0;i<10^5;i++){
wstream.write('Hello World!\n');
}
wstream.end();

解决方法

Node.js是一个单线程执行环境,当您在循环中写入数据时,node.js将没有机会执行其他任务, 从文档(https://nodejs.org/docs/latest-v12.x/api/stream.html#stream_writable_write_chunk_encoding_callback中可以看到,nodejs不能保证一旦调用write就可以写入所有数据,可以对它进行缓冲,如果希望节点保持响应状态,则必须释放事件循环(https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#what-is-the-event-loop)来执行其他任务,可以同时执行这两个操作的示例如下。希望这可以解决问题

var fs = require('fs');
var wstream = fs.createWriteStream('myOutput.txt');
wstream.on('error',function (err) {
    console.log(err);
});



async function write()
{
for(var i=0;i<10^5;i++){
await writeStream(wstream,'Hello world!\n');
}
wstream.end();
}

async function writeStream (stream,data) {
  if (!stream.write(data)) {
   return new Promise((resolv,reject) => {
    stream.once('drain',() => {resolv();});
   });
  } else {
    return Promise.resolve();
  }
}

write();