1

我每分钟都有数据传入,我需要写入多个文件。我目前的解决方案是:

function writeData(data) {
   for(let i = 0; i < data.length; i++) {        
      stream = fs.createWriteStream('myFile' + [i] + '.txt', {flags: 'a'});
      stream.write(data[i] + '\n');
   }
}

writeData()每分钟调用一次。最终我的程序在一段时间后崩溃了。我不记得确切的错误,但它与太多的 writeStreams/fds 或类似的有关。
查看我的代码,该错误似乎是合理的,因为我每分钟都会创建几个新的 writeStreams。问题是,有没有办法只创建一次所有流并在需要时引用它们(通过 ID 或其他东西)?
在此先感谢您的帮助。

4

1 回答 1

1

您需要缓存每个流,并且仅在缓存中不存在时才创建一个。实现这一点的最简单方法是使用模块(充当单例)。下面的代码将使您走上正轨。

// Module file for writeStream cacheing
const streams = [];

export default function writeData(data) {
  for (let i = 0; i < data.length; i++) {
    if (!inCache(i)) {
      addStream(fs.createWriteStream('myFile' + [i] + '.txt', {flags: 'a'}));
      addErrorHandler(i);
    }
    streams[i].write(data[i] + '\n');
  }
}

function inCache(idx) {
  return streams[idx] && streams[idx].writeable;
}

function addStream(stream) {
  streams.push(stream);
}

function addErrorHandler(idx) {
  stream[idx].on('error', (err) => console.log('do something'));
}
于 2021-03-24T16:09:07.760 回答