2013-06-17 13 views
8

Ruby'de aynı JSON dosyasını tekrar tekrar ayrıştırmanın giderek daha büyük miktarda bellek kullandığı görünüyor. kodu ve aşağıda çıkışını düşünün: hafıza birinci tekrarlanmasından sonra serbest bırakılan edilmez NedenNeden yinelenen JSON ayrıştırma daha fazla bellek tüketiyor?

  1. ?
  2. Neden 116MB JSON dosyası ayrıştırıldıktan sonra 1,5Gb RAM alıyor? Metin dosyası karmaşaya dönüştürülürken şaşırtıcıdır. Burada neyi özlüyorum?

Kodu:

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 

Çıktı:

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

Çöp toplayıcı, istediği zaman çalışır, bununla bir ilgisi yoktur * sen * İstediğin zaman ... – meagar

+0

Program bellek tükendiğinde GC çalışmaz mı? Json 400 md olduğunda, ilk iterde 5 gr ram kullanır ve sonra takas kullanmaya başlar (ayrıştırmayı saniyeler yerine on dakika alır). Belleği temizlemek için GC'yi nasıl çağırırdım? – vrepsys

+0

Ruby ve JSON hangi sürümleri kullanılıyor? –

cevap

1

Yakut bir JSON dosyası işlediğinde, hedefe ulaşmak için birçok ara nesneleri oluşturur. Bu nesneler, GC çalışmaya başlayana kadar bellekte kalır.

JSON dosyası karmaşık bir yapıya, birçok diziye ve iç nesneye sahipse, sayı da hızla büyüyecektir.

Ruby'nin kullanılmayan belleği temizlemesini önermek için "GC.start" ı çağırmayı denediniz mi? Eğer bellek miktarı önemli ölçüde azalırsa, sadece veriyi ayrıştırmak için kullanılan ara nesneler olduğu düşünülürse, aksi takdirde, veri yapınız karmaşıktır ya da lib'in tahsis edemeyeceği bir şey vardır.

Büyük JSON işleme için yajl-ruby kullanıyorum (https://github.com/brianmario/yajl-ruby). C uygulanmış ve düşük bir ayak izi var.

+0

teşekkürler, bunu yapacağım. Bu benim sorularıma cevap vermiyor. – vrepsys

+0

@ user1027996 Gönderiyi düzenledim ve bazı bilgileri ekledim. –

+0

GC.start ekleyerek fark yaratmıyor – vrepsys