【发布时间】:2013-06-17 17:18:59
【问题描述】:
似乎在 Ruby 中一遍又一遍地解析同一个 JSON 文件会占用越来越多的内存。 考虑下面的代码和输出:
- 为什么第一次迭代后内存没有释放?
- 为什么一个 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
【问题讨论】:
-
垃圾收集器随心所欲地运行,这与你希望它什么时候......
-
程序内存不足时不应该运行GC吗?当 json 为 400mb 时,它在第一个迭代中使用 5gigs 的 ram,然后开始使用交换(这使得解析需要几十分钟而不是几秒钟)。我将如何调用 GC 来清理内存?
-
正在使用哪些版本的 Ruby 和 JSON?
-
您的意思是“MB”而不是“Mb”吗?在我的世界中,“MB”表示兆字节,“Mb”表示兆比特,两者略有不同。
-
是的,我的意思是兆字节。改为MB。我正在使用红宝石 2.0.0-p0。不知道如何找出 json 版本。看来我没有安装 json gem,但代码仍然有效。
gem check json没有返回任何内容
标签: ruby json memory memory-leaks