node.js - 当我在循环中读取大型 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 文件并处理它们的正确方法吗?
解决方案
require
除了需要模块之外,我不会使用其他任何东西。require
做一些缓存,所以你把你读过的每个文件都保存在内存中。
改为使用fs.readFile
。
推荐阅读
- android - 用户消息传递平台 2.0.0 版本崩溃
- node.js - Firebase 函数、Firestore 和 Axios - 错误:参数“data”的值不是有效的 Firestore 文档
- spring - 如何在 Spring REST 中测试 JWT 过期?
- php - 如何更改vscode中的php版本?
- sql-server - 为什么这行得通?删除多个 froms 没有子查询
- python - 使用 tensorflow 进行可变形状输入
- android - 如何在 android 10 Api level 30 中列出 PDF?
- django - 在 Django Rest Framework 中获取模式和选项
- python - 我可以使用 Keras for CNN 从图像名称中提取图像数据集的标签吗?
- github - Github 操作:在运行程序/路径中找不到依赖项锁定文件