【问题标题】:JSON disk / memory size ratioJSON磁盘/内存大小比
【发布时间】:2015-10-13 13:12:24
【问题描述】:

我以这样一种方式编写了我的 json 结构,即文件(经过一个月的测量后)存储在磁盘上时仍然只有 100 mb 左右。但是现在的文件大约是 20mb,但我看到我的脚本需要的内存大约是 200/300mb。显然,脚本和编译器需要内存,但是将 json txt 作为实际 json 加载到内存中是否会增加 txt 文件大小的大约 8 倍(使用process.memoryUsage() 测量)?我需要数据不断地留在内存中,因为其他功能需要用户请求数据。我只将它保存到文件中作为备份。但是以这种速度,我的服务器将无法处理该脚本。

谁能证实确实如此?如果是这样,您建议我如何减少内存负载?

【问题讨论】:

  • 顺便说一句,我曾经从英雄联盟服务器数据中获取 JSON API 到我的 Java 程序中,它消耗了大量内存(大约 100MB,仅用于几个小文件)。 JSON 对于大数据来说是个坏主意,它对 APIS 和其他东西有好处,但不适合作为存储。无论如何,把东西想象成 Javascript 中的类型化数组。它需要更多地考虑设计,因为您无法调整它们的大小,但在操作时使用更少的内存和 CPU。
  • @Tomáš Zato 我正在做类似的事情。你最终是怎么做到的?您是否使用过某种数据库系统?
  • 不,我创建的类只包含我需要的属性,我给了他们一个 fromJson 方法,他们在其中加载 JSON 数据,然后我将 JSON 从内存中删除。但请记住,与 Java 内存不同,javascript 内存看起来很像 JSON。但是您可能会检查您是否真的需要所有数据,并且数据库听起来并不那么愚蠢,除非您需要闪电般快速。如果这样做,请购买更多 RAM。
  • 我也有同样的问题。你有没有解决过这个问题?为什么内存中的 json 比文件中的 json 大得多?有没有更有效的方法将其存储在内存中?
  • 澄清:我在 js 文件中声明“json”,所以我想将其称为“javascript 对象”更正确,它在内存中比在文件中大得多。我假设你也有同样的情况?

标签: json node.js memory


【解决方案1】:

Json 文件大小表示是它当前使用的实际字节数。

RAM 会有所不同。取决于使用的语言和变量类型。 As per documentation,语言在分配内存时会使用值类型大小。

{"aNumber":1}

在文件中使用 1 字节,但在内存中分配时使用 8 字节(在 Java 中)

为简化起见,您可以估计 RAM 使用量将是文件大小乘以最大类型。所以,是的,文件大小乘以八是一个很好的估计。

编辑:

另外,请记住变量名(字符串)会占用文件大小,而 ram 指针将使用更多

编辑 2:

And if so, how would you suggest I could reduce memory load?

我们可以使用有关您的系统或需求的更多信息。但粗略地说,信息隔离越多越好。

我有一个包含 3200 个传感器的系统,预计总共有 7000 个。对于我的系统,每个“文件输出”都有一百个注册表,每个注册表最多有 10 个字段。这通常意味着一个大约 30kb 的文件,每个文件最多使用 300kb 的 RAM,然后我可以让分布式服务读取一个文件,处理该文件,并在需要时重新输出它。

如果可以的话,每次使用多个数据量较少的文件,一旦处理完一个,就移到下一个

【讨论】:

  • {"aNumber":1} 使用一个字节?我不这么认为。您能否解释一下您是如何得出这个结论的,以及 Java 的 8 字节?
  • 创建一个新文件。在里面写“1”,保存文件。右键单击文件,属性,检查文件大小和磁盘中使用的文件。通常写入 1 个字节,在磁盘中使用 4 kb ......对于 java 部分比较棘手,但如果你在谷歌上搜索,在 Java 中,一个 double 使用 8 个字节,一个 int 使用 4,一个 char 2,所以@987654327变量的@ 是要检查的重要数字
  • 谢谢,我可能会把它分开。现在它是大约 33.000 部词典的集合。你会建议我如何保存数据?序列化它?
  • @Bonatti 但文件包含{"aNumber":1}。 Java 内存也是如此。我们都在谈论 JSON 吗?
  • If two users ask for a request with different conditions a lot of data will be in memory in duplicate 取决于,如果您的服务器有备用内存,并且从不进行内存分页,那么将所有内容保存在内存中将是您最好和最快的方法。例如,如果您在服务器中有4 GB RAM,那将提供512 MB HD 的限制... using 正在分配所有内存。如果您只是在搜索 1 个值……那就是浪费的资源(能量、时间等)。
猜你喜欢
  • 2015-11-14
  • 2016-09-04
  • 2018-06-13
  • 2012-09-13
  • 2015-02-07
  • 2016-08-23
  • 2014-05-24
  • 2013-07-30
  • 2017-11-11
相关资源
最近更新 更多