Невозможно получить нужные листы из огромных файлов xlsx - с помощью библиотеки NodeJS XLSX

Я пытаюсь получить данные из огромного файла (800 тыс. Строк) и поместить его в базу данных через лямбду (AWS). Для этого я получаю файл xlsx из S3 в качестве буфера и читаю его.

module.exports.getSalesData = new Promise((resolve, reject) => {
  getFileFromS3(filename)
    .then(function (workbook) {
      console.log(workbook.SheetNames[1]); // 'sales'
      console.log(workbook.SheetNames); // showing sales as [ 'main', 'sales', 'Sheet1' ]
      console.log(Array.isArray(workbook.SheetNames)); // true
      console.log(typeof workbook.SheetNames); // Object
      console.log(Object.keys(workbook.Sheets)); // [ 'main', 'Sheet1' ] == why 'sales' is not here?

      var sheet_name = workbook.SheetNames[1]; // sales tab
      var json_sheet = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name], { raw: true })
      resolve(json_sheet)
    })
    .catch(err => {
      console.log('File: ' + filename + ' doesn\'t exists on S3 or you\'re not connected to the internet.');
    })
})

Проблема в том, что для workbook.Sheets Я должен увидеть [ 'main', 'sales', 'Sheet1' ], право?

Затем я пытаюсь получить количество строк (уже преобразованных в JSON) следующим образом:

getSalesData.then(function (data) {
    console.log(data.length + ' rows');
    console.log(data[0]);
  }).catch(err => console.error(err));

Где параметр data это json_sheet определено в функции выше. Таким образом, для data.length (количество строк) я получаю 0 вместо 800k+. И, конечно же, я не могу получить data[0] который undefined,

PS: файл имеет 57.3mb - Не уверен, если это причина.

Заранее спасибо за помощь.

1 ответ

Решение

Таким образом, в основном происходило то, что NodeJS не мог прочитать полный файл, потому что он нарушал ограничение памяти виртуальной машины NodeJS для строк.

Так что я должен был увеличить ограничение памяти следующим образом:

node --max-old-space-size=2048 services/process/process-sales.js

Который увеличится с 512 МБ до 2048 МБ / 2 ГБ памяти для NodeJS.

Но это всего лишь решение для чтения большого количества значений.

Я не рекомендую использовать NodeJS для угрозы большому количеству данных, подобных этой. Вместо этого используйте Python, используя некоторую библиотеку, такую ​​как Pandas, и это здорово.

PS: Просто мое мнение и опыт работы с данными с использованием nodejs. Я не думаю, что nodejs был создан для этого.

Другие вопросы по тегам