javascript - NodeJS : invalid array length Allocation failed - JavaScript heap out of memory

标签 javascript node.js puppeteer heap-memory exceljs

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

worksheet.addRows(freedomRawData.records);

“records”是一个包含超过 165,000 个元素的数组。将数据写入 Excel 文件时,出现错误 -

FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory

相同的脚本适用于“记录”长度为 115,000 个元素的数据。通过互联网,我找到了以下方法:

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

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

最佳答案

ExcelJS 有一个流式编写器接口(interface):

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 直到代码暂停后才能运行(即最后的 worbook.commit() 。如果您仍然遇到 OOM 问题,那么您可以强制异步暂停以允许在.commit()实际被收集之后可以清理的行内存。

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

关于javascript - NodeJS : invalid array length Allocation failed - JavaScript heap out of memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63937742/

相关文章:

javascript - $$eval 返回未定义。在 puppeteer js 中

javascript - jQuery 幻灯片是跳动的

javascript - 呈现页面时不显示文本,但如果我之后从 devtools 更改布局,则会显示文本

node.js - React-Router 5 和 Express - Catch-All 路由回退

javascript - express 和 http 之间的技术区别是什么,并就此进行连接

javascript - Puppeteer 循环并转换为对象

c# - puppeteer 师 C# : Connecting to Running Chrome Instance

javascript - 为什么这段代码中的js事件没有冒泡?

javascript - 更新 NGRX/Redux 存储中数组中对象的属性不起作用

javascript - 使用node.js在工作日运行应用程序