2015-11-11 5 views
9

मैं डेटा को पुनर्प्राप्त करने और संग्रहीत करने के लिए एक लूप में ट्विटर, मोंगो और समांतर का उपयोग कर रहा हूं।1 जीबी स्मृति आवंटित "lib/ruby ​​/ 2.1.0/timeout.rb"

मेमोरी उपयोग हिटिंग 1.5GB +

कैसे जीसी इस सफाई नहीं है?

अद्यतन:Here is the script in question

allocated memory by location 
----------------------------------- 
973409328 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:82 
359655091 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/json-1.8.3/lib/json/common.rb:155 
    34706221 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/openssl/buffering.rb:182 
    31767589 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:368 
    22055648 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/parallel-1.6.1/lib/parallel.rb:183 
    12129637 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:525 
    11115133 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/protocol.rb:172 
    10609088 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/idna/pure.rb:177 
    8333448 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:152 
    6041744 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/thread_safe-0.3.5/lib/thread_safe/non_concurrent_cache_backend.rb:8 
    4857232 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:1477 
    4583920 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/monitor.rb:241 
    4524872 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/memoizable-0.4.2/lib/memoizable/method_builder.rb:117 
    4282752 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:151 
    4200641 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/monitoring/command_log_subscriber.rb:104 
    3283047 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:61 
    3150696 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/server/monitor.rb:125 


allocated memory by gem 
----------------------------------- 
1084770550 ruby-2.1.5/lib 
359655091 json-1.8.3 
    53016839 addressable-2.3.8 
    22069048 parallel-1.6.1 
    18422826 twitter-5.15.0 
    10829988 mongo-2.1.1 
    8908392 memoizable-0.4.2 
    6041744 thread_safe-0.3.5 
    4904294 faraday-0.9.2 
    3839455 other 
    3382080 naught-1.1.0 
    2429320 bson-3.2.6 
    1123917 rubygems 
    320962 rollbar-2.4.0 
    205097 activesupport-4.2.4 
    20005 multi_json-1.11.2 
+0

कोड के बिना दिखाया गया है कि यह कहना कारण है कि यह लीक संभव नहीं है। यह असंभव रूबी 2.1.5 खुद को लीक नहीं है। यदि कोड SO पर पोस्ट करने के लिए जटिल है, तो मैं कुछ डीबगिंग टूल जैसे ['gc_tracer'] (https://github.com/ko1/gc_tracer) को वीएम और जीसी के लेखक द्वारा लिखे गए सुझावों का सुझाव दूंगा। – joanbm

+0

बीटीडब्ल्यू। 'टाइमआउट' मॉड्यूल का गलत उपयोग मेमोरी लीक का कारण बन सकता है। इसे अक्सर अनदेखा किया जाता है, अगर स्पष्ट रूप से संभाला नहीं जाता है, तो सुनिश्चित करने या बचाव ब्लॉक में भी समय-समय पर अपवाद उत्पन्न हो सकता है। – joanbm

+0

हाँ, मुझे इसका उपयोग कैसे करना चाहिए? –

उत्तर

3

रूबी स्मृति प्रबंधन दोनों सुरुचिपूर्ण और बोझिल है केवल कुछ करने के लिए सूत्र आप keys.length से उपयोग कर रहे हैं की संख्या कम करने का प्रयास करें। यह वस्तुओं को स्टोर करता है (नाम RVALUE एस) लगभग 16 केबी के आकार के तथाकथित ढेर में। कम स्तर पर, RVALUE एक c-संरचना है, जिसमें विभिन्न मानक रूबी ऑब्जेक्ट प्रस्तुतियों का एक संघ शामिल है।

तो, हेप स्टोर RVALUE ऑब्जेक्ट्स स्टोर करता है, जो आकार 40 बाइट से अधिक नहीं है। String, Array, Hash आदि जैसी वस्तुओं के लिए इसका मतलब है कि छोटी वस्तुएं ढेर में फिट हो सकती हैं, लेकिन जैसे ही वे थ्रेसहोल्ड तक पहुंच जाएंगे, रूबी ढेर के बाहर एक अतिरिक्त मेमोरी आवंटित की जाएगी।

यह अतिरिक्त मेमोरी लचीला है; जैसे ही ऑब्जेक्ट जीसीड बन गया, उतना ही मुक्त हो जाएगा। लेकिन ढेर खुद को ओएस को जारी नहीं किया जाता है।

जिसके अनुसार, एक बार आप एक साथ गहरे लाल रंग का स्मृति में कई कम तार लोड कर रहे हैं, ढेर राशि बढ़ती जा रही है और इस स्मृति वापस माणिक के लिए कभी नहीं दिया जाता है। यह अजीब लग सकता है, लेकिन तारों को स्टोर करने के लिए कृपया कोशिश करें, कम से कम 23 प्रतीकों। यही कारण है कि पागल, प्रस्ताव :)

कि रूप में अच्छी तरह मदद कर सकता है के लिए खेद है: http://www.sitepoint.com/ruby-uses-memory/

+0

तकनीकी विवरण के लिए धन्यवाद - मुझे रूबी के बारे में यह कभी नहीं पता था! हालांकि, मुझे यकीन नहीं है कि आपकी प्रतिक्रिया कैसे कार्यान्वित करें। क्या आप स्रोत में उदाहरणों से लिंक करेंगे जो बहुत अधिक तारों को संग्रहीत करने के लिए ज़िम्मेदार हो सकते हैं? https://gist.github.com/jfeldstein/3769902a50ebef1fb536 यह स्पष्ट नहीं है कि मैं तारों को संग्रहीत किए बिना क्या कर रहा हूं ... –

+0

मुझे इस तरह की लाइनों पर संदेह है: https: //gist.github। com/jfeldstein/3769902a50ebef1fb536 # file-twitter_enrichment-rb-L157 यह 'नक्शा' एक बार में 5000 स्लॉट (ढेर) gorges। इसके साथ खेलने का प्रयास करें (उदाहरण के लिए '5000' के बजाय' 500' का उपयोग करें), लेकिन ईमानदारी से, मुझे यकीन नहीं है कि स्मृति खपत में संकेत देने के लिए एक आसान तरीका है। शायद यह [Elixir] (http://elixir-lang.org/) देने का एक अच्छा समय है :) – mudasobwa

+1

बीटीडब्ल्यू, मूल सवाल _ "जीसी यह कैसे साफ नहीं कर रहा है?" _ ऊपर या कम उत्तर दिया गया है। – mudasobwa

3

आप एक टन डेटा की में लोड कर रहे हैं (आप कैसे कई उपयोगकर्ता हो पर निर्भर करता है) और फिर समानांतर में 20 सेकंड के लिए सो। तो मूल रूप से यदि आपके पास सौ उपयोगकर्ता हैं, तो आप एक बार में 100 उपयोगकर्ताओं के लिए ट्विटर डेटा पुनर्प्राप्त कर रहे हैं और फिर सो रहे हैं, फिर से ऐसा कर रहे हैं। यह स्मृति शायद ऐसा लगता है कि इसे टाइमआउट प्रक्रिया के लिए जिम्मेदार ठहराया जा रहा है क्योंकि यह 20 सेकंड की नींद के दौरान इसका प्रभारी है।

(संख्या के साथ खेलते हैं)

+0

मैंने इसे एक थ्रेड में चलाया है - यह अभी भी ब्लोट्स है। मुझे लगता है कि मैं प्रत्येक मोंगो क्वेरी, या HTTP कॉल के परिणामों का संदर्भ रख रहा हूं ... लेकिन मैं कर सकता हूं यह निर्धारित नहीं है कि –

+2

समस्या स्पष्ट हो सकती है यदि आप पूरी तरह से ऑब्जेक्ट उन्मुख होने के लिए स्क्रिप्ट को दोबारा प्रतिक्रिया देते हैं। अतीत में, मैं कक्षाओं और विधियों में सब कुछ encapsulated करके इस तरह के मुद्दों को इंगित करने में बेहतर रहा हूं। http: // bugroll .com/रॉक-ठोस-रेक-कार्य।एचटीएमएल मदद की हो सकती है; यह मेरी मदद की है। – Matt

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