【问题标题】:Fast method to write in a TXT file?快速写入 TXT 文件的方法?
【发布时间】:2020-01-22 17:37:38
【问题描述】:

我制作了两个代码来创建一个文件并写入其中。 问题是两者都很慢(基于磁盘速度) 有没有更好的方法写入文件?

let codes = [];
function makeid(length) {
   var result           = '';
   var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
   var charactersLength = characters.length;
   for ( var i = 0; i < length; i++ ) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
   }
   return result;

};

   for (let i = 0; 1000000 > i; i++)
   {
       codes.push(`${makeid(20)}`);
   }
   fs.writeFile(`./codes/${makeid(5)}.txt`, codes.join('\n'), (err) => {
       if (err)
       {
           message.reply("There was an error processing your request");
           throw err;
       }
   }) 
/* Second Code */
   let stream = fs.createWriteStream(`./codes/${makeid(5)}.txt`);
   for (let i = 0; 1000000 > i; i++)
   {
       stream.write(`${makeid(20)}`);
   }
   stream.end();
   /* Made by Nadelvorhang */

两个代码都需要 5-15 秒。 我正在寻找一种更快的方法,可以在 > 5 秒或瞬间完成。 文件保存在 txt 中。 谢谢! ~纳德沃杭

【问题讨论】:

  • 使用编程语言编写时,有几层缓冲。 I/O 库中可能有缓冲,操作系统缓冲区,磁盘控制器也可能有自己的缓冲区。该库可能会提供禁用其缓冲的方法,但对较低级别的缓冲区没有太多控制。

标签: javascript node.js fs


【解决方案1】:

缓冲区

您可以创建Buffer,而不是创建一个然后加入的字符串数组。这更快,因为 Node.js 不做任何转换,只是将缓冲区中的字节写入磁盘。

// improved first method

const codes = Buffer.allocUnsafe(1000000 * 20);

for (let i = 0; 1000000 > i; i++) {
  codes.write(`${makeid(20)}`, i * 20, 20);
}

fs.writeFileSync(`./${makeid(5)}.txt`, codes);

在我的机器上,这需要 970.012 毫秒,而不是之前的 1907.401 毫秒,而之前 减少了 50%

【讨论】:

  • 我尝试了代码,它只生成了 1 个代码,然后生成了 2000000 个空行
  • @Nadelvorhang 我的错,忘了写偏移量。我现在已经修好了。
【解决方案2】:

如果可以的话,我认为您应该在文本中写入一次数据。所以你不是在每次迭代时都这样做,而是在循环之后。这样你就可以减少函数调用

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多