javascript - 读取 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
}
....
解决方案
这大约是预期的大小。big.json 的字符串内容至少占用了半个 gig - JavaScript 使用 UCS-2,因此每个字符必须占用 2 个字节。请注意,您并没有释放它(没有delete
声明),因此在您进行测量时仍然会从堆栈中引用它。很难准确地说出“对象数组”的内存布局是什么,但是作为哈希映射的对象确实有一些开销。如果它们包含字符串,那么再次将每个字符计数为双倍。总而言之,这种内存使用是现实的,并非完全出乎意料。
推荐阅读
- excel - 如何在带有隐藏行的表格旁边显示内容excel
- scala - 高阶函数在scala中如何工作?
- typescript - 如何从 JSON 文件中读取数据并在 Cypress 测试中使用它
- nouislider - noUISlider - 如何在不删除元素的情况下销毁 noUiSlider?
- javascript - useContext 或 useEffect 在APP中加载数据...应该使用哪个?
- android - 使用 Kotlin 将日期字符串迁移到 Android Room 中的 Int
- mmenu - mmenu.js:是否可以添加对手风琴风格的可折叠/可扩展菜单的支持?
- google-domains - 有没有办法在谷歌域中找到我当前的动态 ip
- r - 如何规避 table() 函数抛出的 2^31 错误?
- javascript - 减少将数据包装在数组中的函数