【问题标题】:Write huge amounts of data using stream in Node.js在 Node.js 中使用流写入大量数据
【发布时间】:2020-09-09 01:13:21
【问题描述】:

编写一个 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-modules streamwriter


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-02-11
    • 2020-02-28
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2013-01-16
    相关资源
    最近更新 更多