查找 JSON 对象大小而不将其解析为字符串

Posted

技术标签:

【中文标题】查找 JSON 对象大小而不将其解析为字符串【英文标题】:Find JSON object size without parsing it to string 【发布时间】:2019-06-17 03:51:00 【问题描述】:

我知道我可以使用 JSON.parse(data).length 来获取 JSON 对象的大小(以字节为单位)。 //UTF-8 等暂时可以忽略,但是对于我不想要的大量数据,解析需要时间。

有什么方法可以在不将其转换为字符串的情况下以 MB 为单位获取其大小?

【问题讨论】:

get size of json object的可能重复 “大小”是什么意思,你想知道什么?对象的元素数量? 不,这不是重复的,我想知道以 MB 为单位保存这个对象需要多少内存 How to know size of response in ajax request的可能重复 @Arvind 如果我的回答对您有用,您可以接受或限定它,以便其他有类似问题的用户可以更快地找到解决方案。 【参考方案1】:

javascript 中没有计算对象大小的本地方法,但是有一个节点模块可以为您提供以字节为单位的对象大小。 object-sizeof

这将是您需要的示例:  

var sizeof = require('object-sizeof');

// 2B per character, 6 chars total => 12B

console.log(`$sizeof(abc: 'def')/1024 MB`);

【讨论】:

【参考方案2】:

出于安全原因,不允许 Javascript 访问或更改有关设备的信息,因此,应该无法准确确定对象占用的字节数。

话虽如此,以下 Javascript 命令确实存在(仅在 chrome 中):

window.performance.memory

这将返回一个对象,其中包含窗口最多可以使用的字节数、已使用的字节数(包括可用空间)以及实际使用的字节数。从理论上讲,您可以使用它来确定创建对象之前和之后使用的字节数,并计算差异。例如The memory-stats project 使用该命令。

但是,除非使用“--enable-precise-memory-info”标志启动 chrome,否则此对象中的值永远不会改变。因此,您不能在(生产)应用程序中使用此命令(MDN 文档指出the same)。您只能通过计算所有字符串和数字并将其乘以字符串通常占用的字节数(object-sizeof 库就是这样做的)来计算对象占用的内存量。

如果您只对对象的大小感兴趣并且不希望在生产应用中使用该信息,您可以通过在 Chrome 开发工具中创建 timeline recording 来实现。

【讨论】:

【参考方案3】:

我们有下一个选择:

像 object-sizeof 库这样的循环计算 对象到字符串/缓冲区:
    JSON.stringify(a:1).length v8.serialize(a:1).length

【讨论】:

以上是关于查找 JSON 对象大小而不将其解析为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何计算GeoJSON的边界而不将其添加到地图中

如何访问对象而不将其作为参数传递?

我可以使用 Text::CSV_XS 解析 csv 格式的字符串而不将其写入磁盘吗?

如何在 RestKit 中请求托管对象而不将其写回托管对象上下文?

将 python 对象上传到 Google Cloud Storage 而不将其保存到文件

jQuery:如何在事件处理函数中获取事件对象而不将其作为参数传递?