首页 > 解决方案 > 当我在循环中读取大型 JSON 文件时,NodeJS 耗尽了堆空间

问题描述

我有大约 220 个 JSON 文件,每个大约 6MB,我需要解析和处理。所以,我正在循环执行此操作。以下是我阅读和处理它的方式:

        let fileList = fs.readdirSync('/500gb/json_files/gnip_30_p2');
        fileList = fileList.reverse();
        let totalErrors = 0;
        let totalFiles = 0;
        for (let file of fileList) { // TOTAL 220 FILES
            // READ EACH JSON FILE OF ~6MB
            let records = require(`/500gb/json_files/gnip_30_p2/${file}`);
            let results = records.results;
            if (results) {
                for (let record of results) {
                    // .. Some Processing Work Here ..
                }
            }
        }

现在的问题是,运行大约 3 分钟后,JavaScript heap out of memory出现错误:

[3661:0x28af890]    50503 ms: Mark-sweep 1310.9 (1467.4) -> 1310.7 (1470.9) MB, 612.9 / 0.0 ms  allocation failure GC in old space requested
[3661:0x28af890]    51132 ms: Mark-sweep 1310.7 (1470.9) -> 1310.7 (1434.4) MB, 627.7 / 0.0 ms  last resort GC in old space requested
[3661:0x28af890]    51759 ms: Mark-sweep 1310.7 (1434.4) -> 1310.7 (1429.4) MB, 626.4 / 0.0 ms  last resort GC in old space requested

没有递归调用,只有循环,读取,然后在对快速响应的服务进行一些修改后提交读取的数据。那么 NodeJS 耗尽堆空间的原因可能是什么?这不是读取大型 JSON 文件并处理它们的正确方法吗?

标签: node.jsv8heap-memory

解决方案


require除了需要模块之外,我不会使用其他任何东西。require做一些缓存,所以你把你读过的每个文件都保存在内存中。

改为使用fs.readFile


推荐阅读