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 文件并独立处理每个对象

NodeJS 存储基于文件的 JSON 数据库的最佳方式?

处理从 React 应用程序到 NodeJS 后端的长时间运行的发布请求时的建议

使用带有 expressjs 的 multer 上传文件时的错误处理

NodeJS - 处理 100 多个并发连接的内存不足