Rubyで同じJSONファイルを繰り返し解析すると、ますます多くのメモリが使用されるようです。 以下のコードと出力を考えてみましょう。繰り返し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
ガベージコレクタは、実行したいときに実行されます。これは、あなたがしたいときには何もしません。 – meagar
プログラムのメモリ不足時にGCを実行するべきではありませんか? jsonが400MBの場合、最初のiterで5ギガのRAMを使用し、後でスワップを使用し始めます(これにより、解析は数秒ではなく数十分かかります)。どのようにGCを呼び出してメモリをきれいにするのですか? – vrepsys
RubyとJSONのどちらのバージョンが使用されていますか? –