Узел 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");
        }
    });
})

представляет собой массив объектов. Объекты состоят из свойства листаИдентификатор и массива значений данных, которые должны быть добавлены к листу, соответствующему листуИдентификатор. К сожалению, данные не могут быть переданы непосредственно из API, из которого я получаю информацию, поскольку данные ответа API необходимо манипулировать для нашего бизнеса.

Как я могу отправить данные в файл Excel, не исчерпав память для этого процесса? Есть ли что-то, что мне не хватает в файловых потоках, которые используют ненужный объем памяти?

0 ответов

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