ruby - 为什么重复的 JSON 解析会消耗越来越多的内存?

标签 ruby json memory memory-leaks

似乎在 Ruby 中一遍又一遍地解析同一个 JSON 文件会占用越来越多的内存。 考虑下面的代码和输出:

  1. 为什么第一次迭代后内存没有释放?
  2. 为什么一个 116MB 的 JSON 文件解析后会占用 1.5Gb 的 RAM?考虑到文本文件被转换为哈希值,这令人惊讶。我在这里错过了什么?

代码:

require 'json'

def memused
  `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)[1]/1024
end

text = IO.read('../data-grouped/2012-posts.json')
puts "before parsing: #{memused}MB"
iter = 1
while true
  items = JSON.parse(text)
  GC.start
  puts "#{iter}: #{memused}MB"
  iter += 1
end

输出:

before parsing: 116MB
1: 1840MB
2: 2995MB
3: 2341MB
4: 3017MB
5: 2539MB
6: 3019MB

最佳答案

当 Ruby 解析 JSON 文件时,它会创建许多中间对象来实现目标。这些对象会一直保留在内存中,直到 GC 开始工作。

如果JSON文件结构复杂,数组和内部对象多,数量也会增长很快。

您是否尝试调用“GC.start”来建议 Ruby 清理未使用的内存?如果内存量 显着减少,这表明只是用于解析数据的中间对象,否则,您的数据结构很复杂,或者您的数据有一些东西 lib 无法释放。

对于大型 JSON 处理,我使用 yajl-ruby (https://github.com/brianmario/yajl-ruby)。它是 C 实现的,占用空间小。

关于ruby - 为什么重复的 JSON 解析会消耗越来越多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17153194/

相关文章:

ruby - 需要在ruby中每次执行后打印测试的开始和结束时间

ruby-on-rails - JSON 字符串到 rails 哈希

node.js - 如何在 NodeJs 响应中仅发送列表的特定属性

javascript - 你如何在Javascript中清除内存?

c++ - 为什么会出现这种性能下降?

ruby - 使用链接检查器(ruby)

ruby-on-rails - rails : I would like to apply a totally custom search to activerecord - is Rails fast enough?

java - 摩擦正则表达式 : matching a char except when after by another char

javascript - 如何将数组中的对象转换为特定格式

python - 到底是什么占用了这么多内存?