首页 > 解决方案 > 处理大型 XLSX 文件:Node.js 中超出了最大调用堆栈

问题描述

在处理具有 30,000 行的大型 xlsx 文件时,我一直在尝试修复错误。以下是我遇到问题的代码。

const readXlsxFile = require('read-excel-file/node');

    readXlsxFile(filename, {schema}).then((rows) => {
        rows = rows.rows
        let productsDetails = []
        rows.forEach((row, index) => {
            Object.keys(db.productInventory.rawAttributes).forEach((column) => {
                let data;
                try {
                     <if else conditions for edge cases>
                     }
                  })
                 }
               })

schema对象有大约 30 个属性,如果缺少请忽略括号。

上面的代码适用于 1000 行 xlsx 文件。

我试图调试并将断点放在 .then() 函数中,但调试器没有到达那里。

当我点击运行代码时出现以下错误。

断开连接。错误:在 WriteWrap.afterWrite [as oncomplete] (net.js:789:14) 处写入 EPIPE

RangeError:超出最大调用堆栈大小

我无法弄清楚如何解决这个问题。任何人都可以帮忙吗?

标签: node.jsnpmpromiserabbitmqevent-loop

解决方案


当我使用这个标志时它对我有用

node --max-old-space-size=4096 index.js

如果您不手动增加,V8 中的内存使用量有一个严格的标准限制,大约为 1.7 GB。但是,如果您仍然遇到问题并且无法正常工作,请尝试使用此库,它很有用。 https://github.com/SheetJS/js-xlsx

const fs = require('fs');
const XLSX = require('xlsx');

const xlsxFile = 'all_records.xlsx';
const outputFileName = "output.json";

const workbook = XLSX.read(xlsxFile, { type: 'file' });
const [firstSheetName] = workbook.SheetNames;
const worksheet = workbook.Sheets[firstSheetName];
const rows = XLSX.utils.sheet_to_json(worksheet, {
      header: 'A',
      range: 0,
      blankrows: false,
      defval: null,
      raw: true,
});

const stream = fs.createWriteStream(outputFileName, {flags: 'w'});
stream.write(JSON.stringify(rows));

推荐阅读