如何在JavaScript中粗略测量对象大小?

How to measure object size roughly in JavaScript?

提问人:Lance 提问时间:11/9/2023 最后编辑:Lance 更新时间:11/11/2023 访问量:76

问:

背景

我正在努力将一个包含大约 50 个不同表的 SQL 数据库导出到一组 JSON 文件中,我可以在 GitHub 上发布这些文件,以便其他人可以轻松地使用数据引导他们的项目。他们所需要做的就是读取 JSON 文件,随心所欲地修改,然后插入到他们自己的数据库中。

问题是,你不能有非常大的字符串作为JSON文件,因为Node.js对参数大小或字符串大小有限制(我忘记了)。所以在我看来,将内容分成一组JSON文件,然后解释你需要匹配文件夹中的文件才能得到JSON,就像这样。JSON.parseglob./data/**/*.json

我曾想过只发布一个SQL数据库,但我讨厌开放数据项目这样做。现实情况是,他们的 SQL 格式与您的格式不匹配,因此您需要最终将其序列化为 JSON 或类似的东西,最终从他们的 SQL 数据库将其转换为您的 SQL/NoSQL/GraphDB 格式,这只是一种痛苦的经历。而且 db dump 通常是二进制格式,因此它根本不是人类可读的。有时你只是想看一下数据来了解它,而拥有 JSON 是很好的选择。在我的书中,任何二进制文件都不能使用 git。每次提交更改了 1 个“值”的新二进制文件时,它都会分解 git 历史记录,等等。

我想过 CSV,但它是大量导出的树状结构数据。

其中一条评论建议使用 JSON 行分隔的流,这是个好主意,但处理 JSON 流比 glob 加载一堆文件 IMO 要复杂得多,而且文件实际上不能解析为 JSON,这通常是混淆的根源。所以可能会避免这种情况。.json

就我而言,我只需要注意数据列表上的 JSON 文件大小,而不是单个记录。

数据是“简单”树数据,因为没有循环依赖关系。

问题

有哪些启发式方法可以测量 JavaScript 对象的大小?May 的主要目标是限制生成的 JSON 文件大小的大小,使其字符串看起来小于 256 MB。我的意思是,每次向数组添加新属性或项时,我都可以这样做,但这会不断序列化一个每一步都在增长的字符串,这会很慢。Buffer.byteLength(JSON.stringify(obj), 'utf8')

还有哪些其他方法可以使这在构造内存中对象时成为测量 JSON 字符串大小的一种干净的方法?也许只是做这样的事情来向你的对象添加属性?

let totalSize = 0;

function addProperty(obj, name, value) {
  totalSize += 2 + name.length; // 2 for qoutes on each side
  // this is just for string,
  // would have to test on all types.
  totalSize += 2 + value.length;

  obj[name] = value
}

想知道是否已经有一个库来解决这个问题,或者有一套既定的模式来解决这个问题,或者我从那里开始的东西是否有意义。对这方面的任何想法持开放态度。

它不一定是完美的,即使估计高端的尺寸也可以。

我想只是对每个项目做一个相对快速的操作,并将其添加到运行总数中,将意味着我们不会超过两次,我认为这已经足够快了。如果我真的想要,我可以逐步构建 JSON 字符串,一次一个列表项,嗯,也许这会起作用。但在这一点上,这是一种过度优化,可能字符串化两次就可以了。JSON.stringify(listItem, null, 2)

还有哪些其他有益的方法?计算 JSON 对象大小,使其不会超过最大值。老实说,我可能会将每个文件限制在 8mb 左右。

JavaScript 节点 .js JSON

评论

4赞 Mike 'Pomax' Kamermans 11/9/2023
如果您担心的是单个字符串小于 256MB,那么您需要解决非常不同的问题。比如“也许是时候使用适合任务的数据结构、操作转换和数据库了”,而不是使用巨大的 JSON 文件。你到底在做什么让你问这个问题?因为这几乎可以肯定是一个 XY 问题
2赞 jfriend00 11/9/2023
可以估计 JSON 的大小。你只需要为所有类型编写代码,并且你必须以递归方式处理嵌入到其他对象中的对象,如果这需要防弹,那么你需要防止循环引用。我也同意其他评论,这些评论表明,对于您在这里尝试执行的任何操作,JSON都不是理想的格式。
4赞 Amadan 11/9/2023
在这些情况下,这可能表明您使用的格式不适合您的目的。与其将 JSON 破解成它不该做的事情,不如像 JSONL 这样的东西更好地为您服务吗?您可以逐条记录地读取和解析它。
2赞 jfriend00 11/9/2023
或者,根据数据,可能只是一个串行写入的 .CSV 文件。您可以拥有任意数量的数据行,而无需在构造每行数据时一次在内存中保存多个数据行。
5赞 Bergi 11/9/2023
@Lance我不明白你为什么将“开放”等同于“人类可读”。但是,如果它是从关系数据库转储的,我认为没有理由使用元组的流格式不起作用。

答: 暂无答案