Узел xlsx в куче из памяти
В настоящее время у меня есть большой массив данных, которые мне нужно записать в новый файл Excel, однако каждый раз, когда я закрываю поток в файл, процесс завершается с ошибкой.
НЕУСТРАНИМАЯ ОШИБКА: Достигнут предел кучи. Не удалось выполнить выделение: нехватка памяти в куче JavaScript.
Мне удалось выполнить эту операцию, используя меньший набор данных, но у меня возникли проблемы с объемом данных, составляющим, вероятно, около 1 млн+ строк. Код ниже — это то, что я ранее работал с меньшим набором данных.
return new Promise(async (resolve, reject) =>{
const file = new Excel.Workbook();
file.addWorksheet("Other");
file.addWorksheet("Apparel & Merchandise");
file.addWorksheet("ATV, Side-by-Side & UTV Parts");
file.addWorksheet("Motorcycle & Scooter Parts");
file.addWorksheet("Performance & Racing Parts");
file.addWorksheet("RV, Trailer, & Camper Parts");
file.addWorksheet("Car & Truck Parts & Accessories");
file.addWorksheet("Automotive Tools & Supplies");
file.addWorksheet("Safety & Security Accessories");
sheetData.forEach((aspectArray) =>{
const workSheet = file.getWorksheet(aspectArray.sheetIdentifier);
workSheet.addRow(["CategoryID", "Parent Category", "Leaf of the Parent Category", "Category Name", "Aspect Constraint", "Aspect Value", "Aspect Cardinality", "Aspect Mode", "Required?"])
workSheet.addRows(aspectArray.data);
})
await file.xlsx.writeFile(os.tmpdir() + "/eBayUSMotorsItemAspects.xlsx").then((err, resolution) => {
if(err){
reject(console.log(err));
}else{
delayFunctionCall(3000).then(()=>{
email.emailWorkBook();
})
resolve("The workbook is being emailed");
}
})
})
Приведенный выше код работает нормально, но не работает с большим набором данных для помещения в файл Excel. Как я уже сказал, ошибка «Недостаточно памяти в куче Javascript» возникает при работе с большим количеством данных. Из моего тестирования с некоторыми
const writeableStream = fs.createWriteStream(os.tmpdir() + "/eBayUSItemAspects.xlsx");
return new Promise(async (resolve, reject) =>{
const file = new Excel.Workbook();
file.addWorksheet("Business & Industrial");
file.addWorksheet("Consumer Electronics");
file.addWorksheet("Home & Garden");
file.addWorksheet("Sporting Goods");
file.addWorksheet("Toys & Hobbies");
sheetData.forEach((aspectArray) =>{
const workSheet = file.getWorksheet(aspectArray.sheetIdentifier);
workSheet.addRow(["CategoryID", "Parent Category", "Leaf of the Parent Category", "Category Name", "Aspect Constraint", "Aspect Value", "Aspect Cardinality", "Aspect Mode", "Required?"])
aspectArray.data.forEach((value)=> {
file.xlsx.write(writeableStream);
workSheet.addRow(value).commit();
})
})
writeableStream.end();
writeableStream.on('finish', (err, results) => {
if(err){
reject(console.log(err));
}else{
delayFunctionCall(3000).then(()=>{
email.emailWorkBook();
})
resolve("The workbook is being emailed");
}
});
})
Как я могу отправить данные в файл Excel, не исчерпав память для этого процесса? Есть ли что-то, что мне не хватает в файловых потоках, которые используют ненужный объем памяти?