【问题标题】:Is there a faster method to write?有没有更快的写法?
【发布时间】:2020-05-08 18:29:31
【问题描述】:

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

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 中。

【问题讨论】:

  • 您可以为您的问题添加一些上下文吗?正在写入的文件是什么类型的存储?每种方法需要多长时间?您预计它们需要多长时间?
  • @TylerMumford 所以它需要 5-15 秒,它应该只在每个文件中生成带有随机内容的 txt 文件,我尝试找到一个 >5 秒的方法或即时

标签: javascript node.js stream fs


【解决方案1】:

底线Disk access is really slow

如果您可以提前在临时位置创建文件,则移动文件相对来说是即时的。但是创建它们很慢。


代码中的每个for 循环都会将一个20MB 的文件写入存储设备——一百万次迭代,每次迭代增加20 个字符。在某些情况下,20MB 很小,而在其他情况下,它是巨大的。在大多数硬件上,它可能不会是即时的。

根据这些数据是写入硬盘驱动器还是 SSD,性能可能会有很大差异。如果您在带有硬盘驱动器的设备上运行此程序,那几乎可以肯定是大部分延迟的原因。你可以在Wikipedia阅读更多内容。

但是让我们试着让它更快。


在我的机器上,我至少运行了你的原始代码十次。每次运行所花费的时间大致相同,大约为 0.2 秒。这是最后的时间:

第一种方法:1168.626ms
第二种方法:939.847ms
整个程序:2113.624ms

在最后一次console.timeEnd 调用之后的大约 1~2 秒内,程序实际上并没有退出,第二个文件实际上并没有被写入(刷新)。因此,这两种方法的性能可能比这些数字所表明的更为相似。

我尝试了一些不起作用的优化

  1. characterscharactersLength 提取到文件级常量
  2. makeidresults 重构为new Array(length),然后推送并加入(这是一个~1.8 倍的减速,这让我很吃惊)
  3. codes 重构为字符串并使用字符串连接(对于第一种方法,这会降低 2 倍的速度)
  4. 整理代码样式(果然没有效果)

...就是这样。在我尝试的 30 分钟内,我无法对您的代码做出重大改进。


注意事项:

  1. 我通过在命令行上运行 node 直接运行,而不是在 Web 服务器中。
  2. 我正在一台带有 SSD 的机器上运行它(PM981 NVMe Samsung 1024GB,根据设备管理器)。
  3. 第一种方法将codes 与换行符连接起来,因此它最终必须比第二种方法多写入 1-2 MB。

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多