NodeJS:无效的数组长度分配失败-JavaScript堆内存不足

人气:1,264 发布:2022-10-16 标签: javascript node.js heap-memory puppeteer exceljs

问题描述

我正在尝试使用ExcelJS从文件中导出数据并将此数据添加到Excel文件。

worksheet.addRows(freedomRawData.records);

‘记录’是包含超过165,000个元素的数组。将数据写入EXCEL文件时,我收到错误-

致命错误:无效数组长度分配失败-JavaScript堆内存不足

相同的脚本适用于长度为115,000个元素的数据。在网上,我找到了以下方法:

node --max-old-space-size=8192 <file_name>.js

这不起作用,我尝试使用我的RAM的最大容量(16384MB);这也没有帮助。我是NodeJS的新手,任何帮助都将不胜感激。

推荐答案

ExcelJS有一个串流写入器界面:

async function writeExcel(rows_array){
  const workbook = new Excel.stream.xlsx.WorkbookWriter({ filename: 'stream.xlsx' })
  const worksheet = workbook.addWorksheet('data')
  for (const row of rows_array) {
    worksheet.addRow(row).commit()
  }
  await workbook.commit()
}

在这种情况下,由于Node/V8垃圾收集器的工作方式,数据集可能仍然会出现内存问题。垃圾收集需要事件循环的一小部分来实际清理释放的内存。如果您运行足够多同步代码,如for循环,且该循环在每次迭代中分配更多内存,则GC直到代码暂停(即最后一个)之后才能运行。如果您仍然遇到OOM问题,则可以强制异步暂停,以允许实际收集在.commit()之后可以清除的行内存。

  for (const i in rows_array) {
    worksheet.addRow(rows_array[i]).commit()
    if (i % 10000 === 0) await Promise.resolve(true)
  }

834