Невозможно получить нужные листы из огромных файлов 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 был создан для этого.