2011-08-31 13 views
5

ठीक है, यह मेरा सिनात्रा ऐप के साथ मेमोरी मुद्दों को डीबग करने का मेरा दूसरा प्रयास है। मुझे विश्वास है कि मैंने इस बार सरल नमूना कोड में इसे दबा दिया है।रूबी प्रतीक # to_proc 1.9.2-पी 180 में संदर्भ लीक?

ऐसा लगता है कि जब मैं .map(&:some_method) के माध्यम से एक सरणी फ़िल्टर करता हूं, तो यह उस सरणी में आइटम को कचरा नहीं मिला है। बराबर .map{|x| x.some_method} चलाना पूरी तरह से ठीक है।

प्रदर्शन: एक सरल नमूना वर्ग को देखते हुए:

class C 
    def foo 
    "foo" 
    end 
end 

अगर मैं आईआरबी में निम्नलिखित चलाने के लिए, यह आम तौर पर एकत्र हो जाता है:

ruby-1.9.2-p180 :001 > a = 10.times.map{C.new} 
=> [...] 
ruby-1.9.2-p180 :002 > b = a.map{|x| x.foo} 
=> ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"] 
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){} 
=> 10 
ruby-1.9.2-p180 :004 > a = nil 
=> nil 
ruby-1.9.2-p180 :005 > b = nil 
=> nil 
ruby-1.9.2-p180 :006 > GC.start 
=> nil 
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){} 
=> 0 

तो सी का कोई सन्दर्भ अब मौजूद। अच्छा। लेकिन map{|x| x.foo} with map(&:foo) (जो बराबर रूप में विज्ञापित है) प्रतिस्थापन में, एकत्रित नहीं प्राप्त करता है:

ruby-1.9.2-p180 :001 > a = 10.times.map{C.new} 
=> [...] 
ruby-1.9.2-p180 :002 > b = a.map(&:foo) 
=> ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"] 
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){} 
=> 10 
ruby-1.9.2-p180 :004 > a = nil 
=> nil 
ruby-1.9.2-p180 :005 > b = nil 
=> nil 
ruby-1.9.2-p180 :006 > GC.start 
=> nil 
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){} 
=> 10 
ruby-1.9.2-p180 :008 > 

यह एक गहरे लाल रंग का बग है? मैं सुनिश्चित करने के लिए रूबी के अधिक संस्करणों में कोशिश करूंगा लेकिन यह एक स्पष्ट मुद्दा की तरह लगता है। किसी को पता है कि मैं क्या गलत कर रहा हूँ?

संपादित करें:

मैं 1.8.7-p352 में यह कोशिश की है और यह मुद्दा नहीं है। 1.9.3-पूर्वावलोकन 1 है हालांकि अभी भी समस्या है। क्या एक बग रिपोर्ट क्रम में है या क्या मैं कुछ गलत कर रहा हूं?

EDIT2: स्वरूपण (? क्यों प्रत्येक पंक्ति का उत्पादन वाक्य रचना से पहले चार रिक्त स्थान डाल करता है पर प्रकाश डाला, जबकि <pre> टैग नहीं है)

उत्तर

3

a.map(&:foo) रूप a.map{|x| x.foo} के लिए सटीक बराबर होना चाहिए, ऐसा लगता है जैसे आप वास्तव में में एक बग मारा रूबी कोड यहाँ। यह एक बग रिपोर्ट (http://redmine.ruby-lang.org/) पर फ़ाइल करने के लिए चोट नहीं पहुंचा सकता है, जो सबसे बुरा हो सकता है यह है कि इसे अनदेखा किया जा रहा है। आप इस मुद्दे के लिए पैच प्रदान करके इसकी संभावना कम कर सकते हैं।

संपादित करें: मैंने अपने आईआरबी पर फेंक दिया और अपना कोड आजमाया। मैं आपके द्वारा वर्णित मुद्दे को ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux] पर पुन: पेश कर सकता हूं। हालांकि, स्पष्ट रूप प्रतीक पर to_proc बुला एक ही समस्या से ग्रस्त नहीं करता है:

irb(main):001:0> class C; def foo; end; end 
=> nil 
irb(main):002:0> a = 10.times.map { C.new } 
=> [...] 
irb(main):004:0> b = a.map(&:foo.to_proc) 
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 
irb(main):005:0> ObjectSpace.each_object(C){} 
=> 10 
irb(main):006:0> a = b = nil 
=> nil 
irb(main):007:0> GC.start 
=> nil 
irb(main):008:0> ObjectSpace.each_object(C){} 
=> 0 

ऐसा लगता है कि हम यहाँ निहित Symbol -> Proc रूपांतरण के साथ कोई समस्या का सामना कर रहे। शायद मैं बाद में रूबी स्रोत में थोड़ा सा गोता लगाने की कोशिश करूंगा। यदि ऐसा है, तो मैं आपको अद्यतन रखूंगा।

संपादित करें 2: समस्या के लिए

सरल वैकल्पिक हल:

class Symbol 
    def to_proc 
    lambda { |x| x.send(self) } 
    end 
end 

class C 
    def foo; "foo"; end 
end 

a = 10.times.map { C.new } 
b = a.map(&:foo) 
p b 
a = b = nil 
GC.start 
p ObjectSpace.each_object(C) {} 

प्रिंट 0

+0

मैं एक बग रिपोर्ट आज़माउंगा और भेजूंगा लेकिन मुझे रुबी रेडमाइन पर खाता खोलने में परेशानी हो रही है। मैं बाद में तब तक इंतजार करूंगा जब उन्हें अपने लॉगिन सिस्टम में परेशानी हो रही हो। –

+0

मैं Google Mail का उपयोग कर रहा हूं और यह स्पैम के रूप में उनके पुष्टिकरण मेल को चिह्नित करता है। शायद आपको अपने स्पैम फ़ोल्डर की जांच करनी चाहिए: डी –

+0

अच्छी कॉल! मुझे नहीं पता था कि उन्होंने एक पुष्टिकरण मेल भी भेजा था। वैसे भी, बग # 5261: http://redmine.ruby-lang.org/issues/5261 –

संबंधित मुद्दे