首页 > 解决方案 > 读取 JSON 文件在节点中使用大量内存

问题描述

json读取 274.9MB文件并将其作为对象数组存储在变量中会导致 node.js 中的 Resident Set Size 内存使用1.1GB,这让我有点惊讶。

怎么会这样?似乎有点过分了。

import { readFile } from 'fs/promises'

const raw = await readFile('big.json', 'utf8')
const file = JSON.parse(raw)

console.log('Length: ', file.length)
console.log(
  `Memory: ${Math.round((process.memoryUsage().rss / 1024 / 1024) * 100) / 100} MB`
)
Length: 920885
Memory: 1193.05 MB

这里以一个对象的内容为例

{
  keyword: '1 hour circuit training',
  url: 'https://www.pinterest.com/pin/457467274629879495',
  rank: 1,
  page: 1,
  type: 'inline_images',
  title: 'image result',
  domain: '-',
  sitelinks: false
}
.... 

标签: javascriptnode.js

解决方案


这大约是预期的大小。big.json 的字符串内容至少占用了半个 gig - JavaScript 使用 UCS-2,因此每个字符必须占用 2 个字节。请注意,您并没有释放它(没有delete声明),因此在您进行测量时仍然会从堆栈中引用它。很难准确地说出“对象数组”的内存布局是什么,但是作为哈希映射的对象确实有一些开销。如果它们包含字符串,那么再次将每个字符计数为双倍。总而言之,这种内存使用是现实的,并非完全出乎意料。


推荐阅读