nodejs - 处理许多json文件时的内存问题
Posted
技术标签:
【中文标题】nodejs - 处理许多json文件时的内存问题【英文标题】:nodejs - memory issue when processing many many json files 【发布时间】:2022-01-14 22:15:18 【问题描述】:我使用puppeteer 和puppeteer-cluster 对网页进行了性能测试。对于每个用户交互,都会生成一个 chrome dev tools 时间跟踪 json 文件。最后我得到了超过 18,000 个文件,大小在 6M-300K 之间。
我还写了一个脚本,对json文件一一处理,找出交互的开始时间、结束时间和持续时间,并生成最终的测试报告。该脚本在 5,000 个文件中运行良好,但在更多文件时出现“堆内存不足”错误。
实际上,对于每个json文件,一旦我得到我需要的数据(startTime、endTime和duration),我就想释放与文件相关的内存,因为我不再需要这些变量了。
如果无法在运行时释放内存,有没有办法强制我的脚本在预先分配的内存空间内工作?我的测试后脚本需要几个小时才能完成它的工作并不重要。
【问题讨论】:
即时想法:通过子进程(一个子文件/请求/块)从 JSON 中提取数据,并在得到结果后终止子。不会消耗额外的内存。 【参考方案1】:我的错!后期测试脚本中存在一个缺陷,该脚本包含对文件的许多引用。
【讨论】:
【参考方案2】:您可以使用流来避免内存问题。 应该这样做
import JSONStream from 'JSONStream'
import fs from 'fs';
const run = async (file) =>
fs.createReadStream(file)
const myData = [];
await new Promise((resolve, reject) =>
const stream = JSONStream.parse()
stream.on('error', (error) => reject(error))
stream.on('end', resolve)
stream.on("data", function (data)
myData.push(data.startTime)
)
)
return myData
run()
【讨论】:
以上是关于nodejs - 处理许多json文件时的内存问题的主要内容,如果未能解决你的问题,请参考以下文章
在NodeJS中将许多文件中的JSON对象插入MongoDB的最有效方法
在 Nodejs 中解析大型 JSON 文件并独立处理每个对象
处理从 React 应用程序到 NodeJS 后端的长时间运行的发布请求时的建议