2008-08-29 24 views
143

में किसी ऑब्जेक्ट द्वारा कितनी मेमोरी का उपयोग किया जा रहा है, यह पता लगाने के लिए कि आप ऑब्जेक्ट द्वारा कितनी मेमोरी का उपयोग कर रहे हैं? मुझे पता है कि यह पता लगाना संभव है कि कोड के ब्लॉक द्वारा कितना उपयोग किया जाता है, लेकिन किसी तत्काल वस्तु (कभी भी इसके जीवन के दौरान) नहीं, जो मैं चाहता हूं।पता लगाएं कि किसी ऑब्जेक्ट द्वारा पाइथन

+0

समान: http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python –

+0

objgraph दिलचस्प लग रहा है: http: //mg.pov .lt/objgraph/ –

+0

ग्राफिकल टेस्ट: http://stackoverflow.com/a/30008338/2087463 – tmthydvnprt

उत्तर

81

पाइथन ऑब्जेक्ट के मेमोरी आकार को खोजने का कोई आसान तरीका नहीं है। आपको जो समस्याएं मिल सकती हैं वह यह है कि पाइथन ऑब्जेक्ट्स - सूचियों और डिक्ट्स की तरह - अन्य पायथन ऑब्जेक्ट्स के संदर्भ हो सकते हैं (इस मामले में, आपका आकार क्या होगा? प्रत्येक ऑब्जेक्ट का आकार वाला आकार या नहीं?)। ऑब्जेक्ट प्रकारों और कचरा संग्रह से संबंधित कुछ पॉइंटर्स ओवरहेड और आंतरिक संरचनाएं हैं। अंत में, कुछ अजगर वस्तुओं में गैर-स्पष्ट व्यवहार होते हैं। उदाहरण के लिए, अधिकतर वस्तुओं के लिए आरक्षित स्थान सूचीबद्ध करता है, अधिकतर समय; dicts और भी जटिल है क्योंकि वे अलग अलग तरीकों से काम कर सकते हैं कर रहे हैं (वे कुंजी की छोटी संख्या के लिए एक अलग कार्यान्वयन है और कभी कभी वे अधिक प्रविष्टियों का आवंटन)।

मेमोरी में एक पायथन ऑब्जेक्ट के आकार का सबसे अच्छा अनुमान लगाने के लिए वहां big chunk of code (और updated big chunk of code) है। कुछ simpler approximations भी हैं। लेकिन वे हमेशा अनुमानित होंगे।

तुम भी कुछ old description about PyObject (आंतरिक सी struct कि लगभग सभी अजगर वस्तुओं प्रतिनिधित्व करता है) की जाँच कर सकते हैं।

+6

@culix: ऐसा लगता है कि अब इसे [Pympler] में उपयोग किया जाता है (http://pythonhosted.org/Pympler/) मॉड्यूल। – FriendFX

+0

"सरल अनुमान" लिंक टूटा हुआ है - क्या आप [इस संदेश] से लिंक करना चाहते थे (https://mail.python.org/pipermail/python-list/2008-January/510696.html)? – Air

+0

क्या होगा यदि आपका ऑब्जेक्ट बहुत आसान है, जैसे 'Int -> (Int, Int) 'मैपिंग वाला एक dict सिद्धांत रूप में, इस तरह के किसी वस्तु के आकार की गणना करना सरल होना चाहिए, है ना? –

4

मैं नहीं निम्नलिखित में से किसी के साथ किसी भी व्यक्तिगत अनुभव है, लेकिन एक "अजगर [स्मृति] प्रोफाइलर" उपज के लिए एक सरल खोज:

  • PySizer, "अजगर के लिए एक स्मृति प्रोफाइलर," पाया http://pysizer.8325.org/ पर। हालांकि यह पृष्ठ इंगित करता है कि परियोजना को थोड़ी देर के लिए अद्यतन नहीं किया गया है, और यह संदर्भित करता है ...

  • हेपी, "पाइथन कार्यक्रमों में स्मृति संबंधी मुद्दों के बारे में डीबगिंग और अनुकूलन का समर्थन [आईएनजी] http://guppy-pe.sourceforge.net/#Heapy

आशा है कि मदद करता है।

23

एक और दृष्टिकोण अचार का उपयोग करना है। इस प्रश्न के डुप्लिकेट पर this answer देखें।

+3

यह बेहद समझदार * और * सरल दृष्टिकोण है। –

+0

मैं वास्तव में आपके उत्तर से रूचि रखता हूं लेकिन आपके उत्तर को इंगित करने वाले लिंक तक नहीं पहुंच सकता ... –

+0

@YohanObadia मैंने अभी लिंक की कोशिश की और यह काम किया ... यह एक और SO जवाब है। – drevicko

63

इस प्रयास करें:

sys.getsizeof(object) 

getsizeof() वस्तु की __sizeof__ प्रणाली को बुलाती है और एक अतिरिक्त कचरा कलेक्टर भूमि के ऊपर अगर वस्तु कचरा कलेक्टर द्वारा किया जाता है कहते हैं।

A recursive recipe

+2

क्या यह sys.getsizeof (ऑब्जेक्ट) रिटर्न वैल्यू में उनके पॉइंटर के आकार के बजाय असली ऑब्जेक्ट आकार शामिल है जैसा कि ऊपर बताए गए fserb ने कहा है? –

+2

नहीं, यह सूचक का आकार वापस कर देगा। – lstyls

2

यह सावधानी से किया जाना चाहिए, क्योंकि वस्तुओं __sizeof__ गुमराह किया जा सकता है पर एक ओवरराइड।

bregman.suite का उपयोग करके, sys.getsizeof के साथ कुछ परीक्षण ऑब्जेक्ट उदाहरण में एक सरणी ऑब्जेक्ट (डेटा) की प्रतिलिपि ऑब्जेक्ट (mfcc) से बड़ा होने के रूप में आउटपुट करते हैं।

>>> mfcc = MelFrequencyCepstrum(filepath, params) 
>>> data = mfcc.X[:] 
>>> sys.getsizeof(mfcc) 
64 
>>> sys.getsizeof(mfcc.X) 
>>>80 
>>> sys.getsizeof(data) 
80 
>>> mfcc 
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90> 
-2

बड़ा वस्तुओं आप कुछ हद तक एक कच्चे लेकिन प्रभावी तरीका उपयोग कर सकते हैं के लिए: जांच कितनी स्मृति अपने अजगर प्रक्रिया प्रणाली में पर है, तो वस्तु हटा सकते हैं और तुलना करें।

इस विधि में कई कमीएं हैं लेकिन यह आपको बहुत बड़ी वस्तुओं के लिए एक बहुत तेज़ अनुमान देगा।

+3

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

+7

ऑब्जेक्ट बनने से पहले पायथन प्रक्रिया संसाधन उपयोग को मापने का एक समान दृष्टिकोण और बाद में काफी प्रभावी होगा। –

+1

ऐसा मत सोचो @ एंटीनी हैचकिन्स को पाइथन मेमोरी मैनेजर के रूप में ऑपरेटिंग सिस्टम से नई मेमोरी नहीं मिलती है। कुछ हद तक, उपयोग में नहीं होने पर भी मेमोरी पूल आवंटित किया जाता है, इसलिए जब कोई नया अनुरोध होता है, तो इसे ऑपरेटिंग सिस्टम से अधिक मेमोरी का अनुरोध किए बिना पूरा किया जा सकता है। दूसरे शब्दों में, यह दृष्टिकोण वस्तुओं के निर्माण और विनाश दोनों के लिए अविश्वसनीय है। – spider

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