2013-01-08 63 views
7

मैं किसी ऑब्जेक्ट द्वारा उपयोग की गई स्मृति की गणना करना चाहता हूं। sys.getsizeof बहुत अच्छा है, लेकिन उथला है (उदाहरण के लिए, एक सूची में कहा जाता है, इसमें सूची के तत्वों द्वारा ली गई स्मृति शामिल नहीं होगी)।sys.getsizeof का गहरा संस्करण

मैं sys.getsizeof का एक सामान्य "गहरा" संस्करण लिखना चाहता हूं। मैं समझता हूं कि "गहरी" की परिभाषा में कुछ अस्पष्टता है; मैं definition followed by copy.deepcopy से पूरी तरह से खुश हूं।

def get_deep_sizeof(x, level=0, processed=None): 
    if processed is None: 
     # we're here only if this function is called by client code, not recursively 
     processed = set() 
    processed.add(id(x)) 
    mem = sys.getsizeof(x) 
    if isinstance(x, collections.Iterable) and not isinstance(x, str): 
     for xx in x: 
      if id(xx) in processed: 
       continue 
      mem += get_deep_sizeof(xx, level+1, processed) 
      if isinstance(x, dict): 
       mem += get_deep_sizeof(x[xx], level+1, processed) 
    return mem 

यह दो ज्ञात समस्याओं से ग्रस्त है, और अज्ञात समस्याओं की एक अज्ञात नंबर:

यहाँ मेरा पहला प्रयास है

  • मैं एक में एक सामान्य कंटेनर पार करने के लिए पता नहीं कैसे जिस तरह से सभी जुड़ी वस्तुओं को कैप्चर करता है। इसलिए, मैंने in का उपयोग करके पुनरावृत्त किया, और शब्दकोश के मामले को हार्ड कोड किया (मूल्यों को शामिल करने के लिए, न केवल चाबियाँ)। जाहिर है, यह शब्दकोश जैसे अन्य वर्गों के लिए काम नहीं करेगा।
  • मुझे str (जो एक पुनरावृत्त है, और फिर भी किसी अन्य ऑब्जेक्ट्स के लिंक नहीं हैं) को बहिष्कृत करना मुश्किल था। फिर, अगर इस तरह की अधिक वस्तुएं हैं तो यह टूट जाएगा।

मुझे संदेह है कि in का उपयोग करना एक अच्छा विचार नहीं है, लेकिन मुझे यकीन नहीं है कि और क्या करना है।

+0

आह, यह http://stackoverflow.com/questions/5022725/how-do-i-measure-the-memory-usage-of-an-object-in-python और http: // पर एक डुप्लिकेट प्रश्न है। stackoverflow.com/questions/1331471/in-memory-size-of-python-stucture। – max

उत्तर

8

मुझे लगता है कि Pympler आपको पहले से ही इस पंच पर पीटा गया है।

अपनी दस्तावेज़ीकरण से

:

>>> from pympler.asizeof import asizeof 
>>> obj = [1, 2, (3, 4), 'text'] 
>>> asizeof(obj) 
176 

आप एक विशिष्ट उदाहरण चाहते हैं, आप asizeofhere के लिए स्रोत मिल सकता है।

+0

बहुत अच्छा लगता है। हालांकि, ऐसा लगता है कि इस समस्या का कोई सुरुचिपूर्ण समाधान नहीं है; 'pympler' हार्ड कोडिंग' dict' है (और इस तरह के अन्य वर्गों को इस तरह माना जा सकता है)। मुझे आश्चर्य है कि सभी विशेषताओं के माध्यम से पुनरावृत्ति क्यों (विशेष रूप से बहिष्कृत किए गए को छोड़कर) काम नहीं करता है ... – max