node.js - 当我循环读取大型 JSON 文件时,NodeJS 耗尽了堆空间

标签 node.js v8 heap-memory

我有大约 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 堆内存不足 错误:

[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 文件并处理它们的正确方法吗?

最佳答案

除了需要模块之外,我不会将 require 用于任何其他用途。 require 会进行一些缓存,因此您可以将读取的每个文件保留在内存中。

改用fs.readFile

关于node.js - 当我循环读取大型 JSON 文件时,NodeJS 耗尽了堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50266915/

相关文章:

javascript - Function() 构造函数是否没有像 eval 那样被 V8 优化?

c++ - 数组作为模板参数 : stack or heap?

node.js - 如何在 mongodb 的 typeorm 中使用 “OR” 运算符

javascript 引擎 v8 内联缓存

node.js - Mongoose promise 与 bluebird 和 typescript

javascript - 列出 V8 中用户定义的所有函数名称

c - C中字符串的内存分配将在哪里进行

java - 我的 Glassfish 设置是否泄漏内存?

node.js - 在 Node 6 中使用 import 关键字而不使用 Babel

javascript - nodejs facebook messenger bot 管理员或编辑器 id 而不是页面 id