मैं किसी ऑब्जेक्ट द्वारा उपयोग की गई स्मृति की गणना करना चाहता हूं। 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
का उपयोग करना एक अच्छा विचार नहीं है, लेकिन मुझे यकीन नहीं है कि और क्या करना है।
आह, यह 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