Node скрипт вызывает зависание системы при загрузке большого количества файлов - PullRequest
1 голос
/ 26 марта 2020

У меня есть скрипт, который является частью большой программы Electron. Это скрипт al oop, который читает файлы из временного каталога приложения, а затем загружает все файлы на S3. Это работает хорошо для небольших наборов файлов, но для больших, это заставляет компьютер зависать и перезагружаться с системой cra sh (Macbook pro 2018). Большой набор, с которым я тестировал, состоял примерно из 600 файлов (каждый файл маленький, размером менее 1 МБ).

Я не могу получить какую-либо ошибку от самого скрипта, поэтому его немного сложно отладить. Я могу предположить, что это может быть связано либо со многими fs.lstatSync, либо со многими put активными одновременно.

Я хотел бы получить несколько советов о том, как я отлаживаю это (сложно, потому что компьютер зависает) или предложения о том, сколько открытых fs.lstatSync и put стабильно иметь.

const upload = (): void => {
  const fileUploadPromises = [];
  const userDataPath = remote.app.getPath('temp');

  let i = 0;

  let bytes = 0;
  let totalBytes = 0;
  let lastUpdate = 0;

  for (const file of filenames) {
    const filePath = `${userDataPath}chunks/${file}.ts`;
    const stats = fs.lstatSync(filePath);
    const { size } = stats;
    const createdFile = createFileData.createFile[i];

    totalBytes = totalBytes + size;

    fileUploadPromises.push(
      put({
        url: createdFile.presignedPutUrl,
        body: fs
          .createReadStream(filePath)
          .on('data', c => {
            bytes += c.length;

            const stepSize = totalBytes / 100;

            if (bytes - lastUpdate > stepSize) {
              setProgress(bytes / totalBytes);
              lastUpdate = bytes;
            }
          })
          .on('error', e => {
            console.error(e); // eslint-disable-line
          }),
        headers: {
          'Content-length': size,
        }
      }).catch(e => {
        console.error(e); // eslint-disable-line
      })
    );

    i = i + 1;
  }
};
...