Есть ли более быстрый способ написать? - PullRequest
0 голосов
/ 22 января 2020

Я сделал два Кода, чтобы сделать файл и написать в нем. Проблема в том, что они медленные (в зависимости от скорости диска). Есть ли лучший способ записи в файл?

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 секунд. Я ищу более быстрый метод, который может сделать это за> 5se c или мгновенно. Файл сохраняется в текстовом формате.

1 Ответ

0 голосов
/ 22 января 2020

Итог : Доступ к диску действительно медленный .

Если вы можете создать файлы во временном местоположении заранее, перемещение файлов происходит относительно быстро. Но их создание выполняется медленно.


Каждый из циклов for в вашем коде записывает файл 20 МБ на устройство хранения - один миллион итераций, каждая из которых добавляет 20 символов. В некоторых контекстах 20 МБ крошечные, а в других - ОГРОМНЫЕ. Это, вероятно, не будет мгновенным на большинстве аппаратных средств.

В зависимости от того, записываются ли эти данные на жесткий диск или SSD, производительность может сильно различаться. Если вы запускаете эту программу на устройстве с жестким диском, это почти наверняка объясняет большую часть задержки. Вы можете прочитать больше в Википедии .

Но давайте попробуем сделать это быстрее.


На моей машине я запускал ваш исходный код по крайней мере десять раз. Каждый прогон занимал примерно одинаковое количество времени, давал или занимал 0,2 секунды или около того. Это окончательное время:

первый метод: 1168,626 мс
второй метод: 939,847 мс
вся программа: 2113,624 мс

Программа фактически не завершилась, и второй На самом деле файл не записывался (сбрасывался) в течение 1-2 секунд после последнего вызова console.timeEnd. Таким образом, эти два метода, вероятно, более похожи по производительности, чем указывают эти цифры.

Я попробовал некоторые оптимизации, которые не работали :

  1. Извлечение characters и charactersLength к константам на уровне файла
  2. Преобразование makeid results в new Array(length) с последующим нажатием и присоединением (это было замедлением ~ 1,8x, что меня удивило)
  3. Рефакторинг codes в строку и использование конкатенации строк (это было в 2 раза медленнее для первого метода)
  4. Приведение в порядок стиля кода (как и ожидалось, это не дало эффекта)

... и все. Я не смог значительно улучшить ваш код за 30 минут, которые я потратил на попытки.


Примечания и предостережения:

  1. Я запускаю прямо, запустив node в командной строке, а не на веб-сервере.
  2. Я запускаю это на машине с SSD (PM981 NVMe Samsung 1024GB, согласно диспетчеру устройств).
  3. Первый Метод объединяет codes с символами новой строки, поэтому в итоге приходится писать на 1-2 МБ больше, чем во втором методе.
...