2010-04-20 17 views
8

मैं एक रेल 2.3 विकसित कर रहा हूं, रूबी 1.9.1 वेबप्लिकेशंस जो प्रत्येक अनुरोध से पहले गणना का एक गुच्छा करता है। प्रत्येक अनुरोध के लिए इसे 300 नोड्स और ~ 1000 किनारों वाले ग्राफ की गणना करना है। ग्राफ और उसके सभी नोड्स, किनारों और अन्य वस्तुओं को प्रत्येक अनुरोध (~ 2000 ऑब्जेक्ट्स) के लिए प्रारंभ किया जाता है - वास्तव में उन्हें मार्शल.लोड (मार्शल डंप()) का उपयोग करके एक अनचाहे कैश किए गए ग्राफ से क्लोन किया जाता है।रूबी 1.9 कचरा कोलेक्टर, जीसी.disable/सक्षम

प्रदर्शन यहां काफी समस्या है। अभी पूरा अनुरोध औसत 150ms में लेता है। मैंने तब देखा कि एक अनुरोध के दौरान, गणना के कुछ हिस्सों में यादृच्छिक रूप से अधिक समय लगता है। मान लीजिए कि यह कचरा कलेक्टर हो सकता है, मैंने जीसी डिसेबल और जीसी.एनेबल में अनुरोध लपेट लिया है, ताकि अनुरोध गणना और प्रतिपादन समाप्त होने तक कचरे के साथ इंतजार कर रहा हो।

def query 
    GC.disable 
    calculate 
    respond_to do |format| format.html {render} end 
    GC.enable 
end 

औसत अनुरोध में अब लगभग 100ms (50 एमएस कम) लगता है।

लेकिन मुझे यकीन है कि यह एक अच्छा/स्थिर समाधान है, मुझे लगता है कि ऐसा करने में कमी होनी चाहिए। क्या किसी को भी ऐसी ही समस्या का अनुभव है या उपरोक्त कोड के साथ समस्याएं देखती हैं?

उत्तर

1

कोई वास्तविक नुकसान नहीं, सिवाय इसके कि जीसी को फिर से सक्षम करने में अधिक समय लगेगा।

रूबी के जीसी ट्यूनिंग पर वेब पर कई लेख हैं। उन पर एक नज़र डालें, और शायद आप उन पंक्तियों को हटा सकते हैं। =)

कोई परिणाम नहीं है कि आप परिणामों को कैश कर सकते हैं और हर कुछ मिनट में पृष्ठभूमि पर कैल्क्स को फिर से कर सकते हैं?

+0

कैश करने के लिए संभव नहीं है, गणना उपयोगकर्ता इनपुट पर निर्भर करती है। – seb

0

यह बेवकूफ लग सकता है लेकिन इस मामले में, मैं आपके आरओआर से सी फ़ंक्शन को कॉल करने का प्रयास करूंगा। यह समाधान काफी कट्टर है, लेकिन यह आश्चर्यजनक प्रदर्शन परिणाम देना चाहिए;)

माणिक के साथ आपका समाधान एक लंबे थेर्म समाधान यह सिर्फ एक ठीक है नहीं है ...

5

यह तेजी से अपने अनुप्रयोग करता है, तो इसका इस्तेमाल ।

मैं ensure कथन जोड़ दूंगा ताकि यदि कोई अपवाद उठाया गया हो तो आप अक्षम कचरा संग्रह के साथ समाप्त नहीं होते हैं।

def query 
    GC.disable 
    calculate 
    respond_to do |format| format.html {render} end 
ensure 
    GC.enable 
end 
+0

यह बहुत उपयोगी है। tnx – seb

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