2011-05-24 18 views
8

मेरा पायथन कार्यक्रम एक उत्सुक प्रदर्शन व्यवहार है: जितना लंबा चलता है, धीमा हो जाता है। प्रारंभ में, यह प्रति मिनट कार्य इकाइयों में से एक है। एक घंटे के बाद यह प्रति कार्य इकाई में दस मिनट लग रहा है। मेरा संदेह यह है कि यह एक भीड़ कचरा कलेक्टर द्वारा कारण है।कचरा कलेक्टर का उपयोग कितना समय है?

पकड़ यह है कि मेरी स्क्रिप्ट सीप्रोफाइल के लिए बड़े पैमाने पर काम करने के लिए भूख लगी है। (देखें: cProfile taking a lot of memory)

हमने अपनी खुद की प्रदर्शन प्लगइन लिखी है और हम अपने सिस्टम के अधिकांश हिस्सों को देख सकते हैं और उनमें से कोई भी समस्या नहीं प्रतीत होता है। एक चट्टान जो अभी भी उलझा हुआ है जीसी है।

क्या कोई अन्य तरीका है (प्रोफ़ाइल या सीप्रोफाइल के अलावा) यह देखने के लिए कि जीसी में कितना समय जा रहा है?

उत्तर

6

पायथन में, अधिकांश कचरा संदर्भ गणना का उपयोग करके एकत्र किया जाता है। कोई उम्मीद करेगा कि यह तेज़ और दर्द रहित हो, और ऐसा लगता है कि यह वही है जो आप कर रहे हैं। मुझे लगता है कि आप gc मॉड्यूल द्वारा संदर्भित कलेक्टर के बारे में पूछ रहे हैं, जिसका उपयोग केवल परिपत्र संदर्भों के लिए किया जाता है।

कुछ चीजें है कि काम का हो सकता है: http://docs.python.org/library/gc.html

यद्यपि समय कचरा कलेक्टर के लिए एक सीधा तरीका हो प्रतीत नहीं होता है, तो आप, बदल सकते हैं और बंद पर डिबगिंग को सक्षम, संग्रह गिनती आदि देखें। यह सब आपकी खोज में सहायक हो सकता है।

उदाहरण के लिए, अपने सिस्टम पर बाहर बीता हुआ समय gc प्रिंट अगर आप डिबग झंडे पर बारी:

In [1]: import gc 

In [2]: gc.set_debug(gc.DEBUG_STATS) 

In [3]: gc.collect() 
gc: collecting generation 2... 
gc: objects in each generation: 159 2655 7538 
gc: done, 10 unreachable, 0 uncollectable, 0.0020s elapsed. 

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

+0

हां, मुझे इसके बारे में पता है। वे मुझे बता सकते हैं कि जीसी किस तरह से काम कर रही है, लेकिन मेरी तत्काल समस्याएं प्रोसेसर चक्रों के साथ हैं, स्मृति नहीं। अगर यह मुझे * समय * बता सकता है कि जीसी ने उपयोग किया है या यहां तक ​​कि * कितनी बार * यह चलाया गया है, यह सहायक हो सकता है। –

+0

@ मैथ्यू: क्या यह आपकी प्रक्रिया को 'gc.collect()' को कॉल करने में मदद करेगा, और समय लौटने में कितना समय लगेगा? –

+0

@ थॉमस के, जो मुझे बताएगा कि एक संग्रह कितना समय ले रहा था, लेकिन कलेक्टर कितनी बार चल रहा है। मेरे पास अन्य डेटा को देखते हुए, मुझे संदेह है कि जीसी अधिक से अधिक बार चल रहा है (कम और कम प्रभाव) क्योंकि सिस्टम चलता है। –

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