में सहायता नहीं करता है मेरे पास एक रेल ऐप है जो एक MySQL डेटाबेस में बड़ी (लाखों) रिकॉर्ड्स को संसाधित करता है। एक बार यह काम शुरू हो जाने के बाद, इसकी स्मृति का उपयोग प्रति सेकंड 50 एमबी की रफ्तार से बढ़ता है। ओंक जैसे टूल्स के साथ मैं मूल कारण को एक लूप को सीमित करने में सक्षम था जो डेटाबेस में एक बड़ी तालिका में सभी रिकॉर्ड्स के माध्यम से जाता है।रेल मेमोरी रिसाव पर रूबी; find_each
मैं समझता हूं कि अगर मैं Person.all.each जैसे कुछ का उपयोग करता हूं, तो सभी रिकॉर्ड स्मृति में लोड हो जाएंगे। हालांकि अगर मैं find_each पर स्विच करता हूं, तो भी मुझे वही स्मृति समस्या दिखाई देती है। समस्या को और अलग करने के लिए मैंने निम्न परीक्षण नियंत्रक बनाया है, जो रिकॉर्ड के माध्यम से लूपिंग के अलावा कुछ भी नहीं करता है। मुझे लगता है कि find_each प्रत्येक बार स्मृति में केवल छोटी संख्या में ऑब्जेक्ट रखता है, लेकिन मेमोरी उपयोग रैखिक रूप से बढ़ता है क्योंकि यह निष्पादित होता है।
class TestController < ApplicationController
def memory_test
Person.find_each do |person|
end
end
मुझे संदेह है कि इसे क्वेरी परिणाम कैशिंग ActiveRecord के साथ करना है। लेकिन मैंने अपनी पर्यावरण सेटिंग्स की जांच की और मेरे पास सभी कैशिंग संबंधित विकल्प विकास में झूठे सेट हैं (मैं रेल द्वारा बनाई गई डिफ़ॉल्ट सेटिंग्स का उपयोग कर रहा हूं)। मैंने कुछ खोज ऑनलाइन की लेकिन मुझे कोई समाधान नहीं मिला।
मैं रेल उपयोग कर रहा हूँ 3.1.0 RC1 और गहरे लाल रंग का 1.9.2
धन्यवाद!
मुझे लगता है कि ActiveRecord में 'find_in_batches' नामक एक फ़ंक्शन है। हो सकता है कि यह स्मृति प्रकोप को नियंत्रित करने में मदद करेगा। – rubish
मैं यह भी सोच रहा था, हालांकि, ऐसा लगता है कि 'find_each' कवर के तहत 'find_in_batches' का उपयोग करता है। हो सकता है कि प्रत्येक व्यक्तिगत पंक्ति बड़ी हो और ': batch_size' विकल्प (1000 पंक्तियों के लिए डिफ़ॉल्ट) से लाभ हो सकती है – Brian
वास्तव में कोड क्या है जो इसे प्रत्येक रिकॉर्ड के माध्यम से लूप करने की आवश्यकता है? – Maran