簡體   English   中英

NodeJS:無效的數組長度分配失敗 - JavaScript 堆內存不足

[英]NodeJS: invalid array length Allocation failed - JavaScript heap out of memory

我正在嘗試從文件中導出數據並使用 ExcelJS 將此數據添加到 Excel 文件中。

worksheet.addRows(freedomRawData.records);

'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 將無法運行,直到代碼暫停(即最終的worbook.commit() 。如果您仍然遇到OOM 問題然后您可以強制異步暫停以允許實際收集.commit()后可以清理的行內存。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM