اكتشف مقدار الذاكرة التي يستخدمها كائن في Python [نسخة مكررة]
-
09-06-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- كيف يمكنني تحديد حجم الكائن في بايثون؟ 10 إجابات
كيف يمكنك معرفة مقدار الذاكرة التي يستخدمها كائن ما؟أعلم أنه من الممكن معرفة مقدار ما يتم استخدامه بواسطة كتلة من التعليمات البرمجية، ولكن ليس بواسطة كائن تم إنشاء مثيل له (في أي وقت خلال حياته)، وهو ما أريده.
المحلول
لا توجد طريقة سهلة لمعرفة حجم ذاكرة كائن بايثون.إحدى المشاكل التي قد تجدها هي أن كائنات بايثون - مثل القوائم والإملاءات - قد تحتوي على إشارات إلى كائنات بايثون أخرى (في هذه الحالة، ما هو حجمك؟الحجم الذي يحتوي على حجم كل كائن أم لا؟).هناك بعض المؤشرات العامة والهياكل الداخلية المتعلقة بأنواع الكائنات وجمع البيانات المهملة.أخيرًا، بعض كائنات بايثون لها سلوكيات غير واضحة.على سبيل المثال، تحتفظ القوائم بمساحة لعناصر أكثر مما تحتوي عليه، في معظم الأوقات؛تعد الإملاءات أكثر تعقيدًا نظرًا لأنها يمكن أن تعمل بطرق مختلفة (لديها تطبيق مختلف لعدد صغير من المفاتيح وأحيانًا تقوم بتخصيص الإدخالات بشكل مفرط).
هناك قطعة كبيرة من التعليمات البرمجية (و تحديث جزء كبير من التعليمات البرمجية) هناك لمحاولة تقريب حجم كائن بايثون في الذاكرة بشكل أفضل.
قد ترغب أيضًا في التحقق من بعضها الوصف القديم حول PyObject (بنية C الداخلية التي تمثل جميع كائنات بايثون تقريبًا).
نصائح أخرى
جرب هذا:
sys.getsizeof(object)
يحصل على حجم () يستدعي الكائن __sizeof__
الأسلوب ويضيف حملًا إضافيًا لأداة تجميع البيانات المهملة لو تتم إدارة الكائن بواسطة جامع البيانات المهملة.
هناك طريقة أخرى وهي استخدام المخلل.يرى هذه الإجابة إلى نسخة مكررة من هذا السؤال.
ليس لدي أي خبرة شخصية مع أي مما يلي، ولكن بحث بسيط عن نتيجة "ملف تعريف Python [الذاكرة]":
تم العثور على PySizer، "ملف تعريف الذاكرة لـ Python" في http://pysizer.8325.org/.ومع ذلك، يبدو أن الصفحة تشير إلى أن المشروع لم يتم تحديثه لفترة من الوقت، وتشير إلى...
Heapy، "يدعم تصحيح الأخطاء والتحسين فيما يتعلق بالمشكلات المتعلقة بالذاكرة في برامج Python،" الموجود في http://guppy-pe.sourceforge.net/#Heapy.
امل ان يساعد.
يجب استخدام هذا بحذر لأن تجاوز الكائنات __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>
بالنسبة للأشياء الكبيرة، يمكنك استخدام طريقة بسيطة إلى حد ما ولكنها فعالة:تحقق من مقدار الذاكرة التي تشغلها عملية بايثون في النظام، ثم احذف الكائن وقارنه.
هذه الطريقة لها عيوب كثيرة ولكنها ستمنحك تقديرًا سريعًا جدًا للأجسام الكبيرة جدًا.