2012-08-09 1 views
15

में ऑब्जेक्ट के सभी संदर्भ खोजें पाइथन में किसी ऑब्जेक्ट के सभी संदर्भों को खोजने का एक अच्छा तरीका क्या है?पाइथन

कारण मैं पूछता हूं कि ऐसा लगता है कि हमारे पास "स्मृति रिसाव" है। हम वेब ब्राउज़र से सर्वर पर छवि फ़ाइलों को अपलोड कर रहे हैं। प्रत्येक बार जब हम ऐसा करते हैं, तो सर्वर पर मेमोरी उपयोग बढ़ जाता है जो फ़ाइल के आकार के अनुपात में आनुपातिक रूप से ऊपर जाता है। यह मेमोरी पाइथन कचरा संग्रह द्वारा कभी भी रिलीज़ नहीं हो रही है, इसलिए मैं सोच रहा हूं कि शायद प्रत्येक डेटा के अंत में भी हटाए जा रहे छवि डेटा को इंगित नहीं कर रहे हैं या स्कोप से बाहर जा रहे हैं।

मुझे लगता है कि यह पाइथन से पूछने में सक्षम होना अच्छा होगा: "इस संदर्भ में अभी भी कौन से संदर्भ हैं?" ताकि मैं यह समझ सकूं कि कचरा संग्रह को मुक्त करने से क्या बचा रहा है।

वर्तमान में हम एक हेरोकू सर्वर पर पायथन और Django चला रहे हैं।

कोई भी सुझाव और विचारों की सराहना की जाती है, बहुत बहुत धन्यवाद!

+0

http://stackoverflow.com/questions/1339293/python-memory-leak-debugging –

+0

आप इस को देखा है: http://stackoverflow.com/questions/110259/python-memory-profiler –

उत्तर

10

पायथन की मानक लाइब्रेरी में gc मॉड्यूल कचरा कलेक्टर API युक्त है। एक समारोह में से एक है जो आप चाहते हैं

gc.get_objects() 

यह फ़ंक्शन वर्तमान में कचरा कलेक्टर द्वारा ट्रैक की गई सभी वस्तुओं की सूची देता है। अगला कदम इसका विश्लेषण करना है।

आप वस्तु क्या आप sys मॉड्यूल के getrefcount समारोह का उपयोग कर सकते ट्रैक करना चाहते हैं जानते हैं:

>>> x = object() 
>>> sys.getrefcount(x) 
2 
>>> y = x 
>>> sys.getrefcount(x) 
3 
+9

sys.getrefcount() उपयोगी है, लेकिन क्या यह संदर्भ देखने का कोई तरीका है कि वे संदर्भ क्या हैं? – RAAC

12

पायथन के gc मॉड्यूल कई उपयोगी कार्य करता है, लेकिन यह लग रहा है gc.get_referrers() की तरह आप के लिए क्या देख रहे है। यहाँ एक उदाहरण है:

import gc 


def foo(): 
    a = [2, 4, 6] 
    b = [1, 4, 7] 

    l = [a, b] 
    d = dict(a=a) 
    return l, d 

l, d = foo() 
r1 = gc.get_referrers(l[0]) 
r2 = gc.get_referrers(l[1]) 

print r1 
print r2 

जब मैं चलने वाले, मैं निम्नलिखित उत्पादन देखें:

[[[2, 4, 6], [1, 4, 7]], {'a': [2, 4, 6]}] 
[[[2, 4, 6], [1, 4, 7]]] 

आप देख सकते हैं कि पहली पंक्ति l और d, और दूसरी लाइन बस l है।

मेरे संक्षिप्त प्रयोगों में, मैंने पाया है कि परिणाम हमेशा यह साफ नहीं होते हैं। आंतरिक तारों और tuples, उदाहरण के लिए, आप अपेक्षा की तुलना में अधिक रेफरर हैं।

+1

यह सबसे सरल और सबसे अच्छा जवाब प्रतीत होता है। –