javascript - 堆内存不足

问题描述 投票:0回答:1

我在nodejs中有api,用于从mysql数据库读取数据并将其写入csv文件,并在完成写入csv文件后下载文件,所以当我在数据库中有大约170万条记录时,它正在工作,但现在我有大约500万条记录,所以它给我错误 javascript - 堆内存不足我在这里提供了我的 api 代码:

exports.exportdatatocsv = async (req, res) => {
    con.query(
        "SELECT sender_name, table_name FROM sender_tbl where sender_name ",
        function (error, data) {
            if (error) {
                console.error(error);
                res.status(500).send("Internal Server Error");
                return;
            }

            var mysqlData = JSON.parse(JSON.stringify(data));
            var workbook = new ExcelJS.stream.xlsx.WorkbookWriter({ stream: res });

            mysqlData.forEach((sender, index) => {
                var worksheet = workbook.addWorksheet(
                    sender.sender_name.substring(0, 31)
                );

                con.query(
                    `SELECT * FROM ${sender.table_name} ORDER BY id DESC`,
                    function (error, tableData) {
                        if (error) {
                            console.error(error);
                            res.status(500).send("Internal Server Error");
                            return;
                        }

                        var fileHeader = [
                            "message",
                            "info",
                            "credit/debit",
                            "amount",
                            "netbal",
                        ];
                        worksheet.addRow(fileHeader);

                        tableData.forEach((row) => {
                            worksheet.addRow([
                                row.message,
                                row.info,
                                row.isdebit ? "debit" : "credit",
                                row.amount,
                                row.netbal,
                            ]);
                        });

                        if (index === mysqlData.length - 1) {
                            workbook
                                .commit()
                                .then(function () {
                                    res.status(200).end();
                                })
                                .catch(function (err) {
                                    console.error(err);
                                    res
                                        .status(500)
                                        .send("Error occurred while generating Excel file");
                                });
                        }
                    }
                );
            });
        }
    );
};

我已经实现了流,但仍然无法工作,而且我对流没有太多了解

javascript mysql node.js express stream
1个回答
0
投票
在某些 64 位系统上,Node 的默认最大内存使用量小于

2GB,具体取决于 Node 运行时版本。这可能会在运行时导致意外的内存问题。

可以使用传递到 Node 的命令行标志来调整最大内存上限:

node --max-old-space-size=8192 your_script.js // 8192MB = 8GB
如果您想确保所有分叉节点进程都希望使用此设置运行,请使用此

NODE_OPTIONS=--max-old-space-size=4096 node your_script.js //4GB
    
© www.soinside.com 2019 - 2024. All rights reserved.