मैं कुछ पृष्ठभूमि विश्लेषण चलाने के लिए देरी वाली नौकरी का उपयोग करने की योजना बना रहा हूं। मेरे प्रारंभिक परीक्षण में मैंने मेमोरी उपयोग की जबरदस्त मात्रा देखी, इसलिए मैंने मूल रूप से एक बहुत ही सरल कार्य बनाया जो हर 2 मिनट में चलता है यह देखने के लिए कि कितनी मेमोरी का उपयोग किया जा रहा है।रेल मेमोरी उच्च मेमोरी उपयोग
कार्य बहुत आसान है और analytics_eligbile? विधि हमेशा झूठी वापसी करती है, जहां डेटा अब है, इसलिए मूल रूप से भारी मारने वाले कोड में से कोई भी नहीं कहा जा रहा है। मेरे विकास में मेरे नमूना डेटा में लगभग 200 पद हैं। पोस्ट has_one analytics_facet है।
यहां तक कि आंतरिक तर्क/व्यवसाय के बावजूद, यह कार्य केवल एक ही चीज है जो analytics_exiable को कॉल कर रहा है? विधि हर 2 मिनट 200 बार। 4 घंटों के मामले में मेरा भौतिक स्मृति उपयोग 110 एमबी और वर्चुअल मेमोरी 200 एमबी पर है। बस कुछ आसान करने के लिए! मैं यह भी कल्पना नहीं कर सकता कि यह वास्तविक उत्पादन डेटा के साथ 10,000 पदों पर वास्तविक विश्लेषण करने पर कितनी मेमोरी खाएगी !! यह माना जाता है कि यह हर 2 मिनट की तरह नहीं चल सकता है, फिर भी मुझे नहीं लगता कि यह उड़ जाएगा।
यह रूबी 1.9.7 चल रहा है, उबंटू 10.x 64 बिट पर रेल 2.3.5। मेरे लैपटॉप में 4 जीबी मेमोरी, डुअल कोर सीपीयू है।
क्या रेल वास्तव में यह बुरा है या क्या मैं कुछ गलत कर रहा हूं?
Delayed::Worker.logger.info('RAM USAGE Job Start: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Post.not_expired.each do |p|
if p.analytics_eligible?
#this method is never called
Post.find_for_analytics_update(p.id).update_analytics
end
end
Delayed::Worker.logger.info('RAM USAGE Job End: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Delayed::Job.enqueue PeriodicAnalyticsJob.new(), 0, 2.minutes.from_now
पोस्ट मॉडल
def analytics_eligible?
vf = self.analytics_facet
if self.total_ratings > 0 && vf.nil?
return true
elsif !vf.nil? && vf.last_update_tv > 0
ratio = self.total_ratings/vf.last_update_tv
if (ratio - 1) >= Constants::FACET_UPDATE_ELIGIBILITY_DELTA
return true
end
end
return false
end
एकमात्र चीज जो मैं इस उत्कृष्ट उत्तर में जोड़ूंगा वह एक नोट है कि किसी भी रेल प्रक्रिया में काफी मेमोरी का उपभोग होगा - आपका 110 एमबी असामान्य नहीं है। यह आपके कोड में मेमोरी लीक का संकेत नहीं है, या आपने कितनी प्रोसेसिंग की है। प्रसंस्करण 1000 रिकॉर्ड या 10 एम रिकॉर्ड मेमोरी की एक ही मात्रा का उपयोग करेंगे यदि आपने चीजें ठीक से की हैं (जिस तरह क्रिस ने समझाया है)। – wuputah