我有大约 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/