سؤال

أريد أن أعرف استخدام الذاكرة لتطبيق Python الخاص بي وأريد على وجه التحديد معرفة كتل/أجزاء التعليمات البرمجية أو الكائنات التي تستهلك معظم الذاكرة.يظهر بحث جوجل تجاريًا مدقق ذاكرة بايثون (ويندوز فقط).

وتلك مفتوحة المصدر بايسيزر و هيبي.

لم أجرب أحدًا، لذلك أردت أن أعرف أيهما أفضل:

  1. يعطي معظم التفاصيل.

  2. لا بد لي من إجراء تغييرات قليلة أو معدومة على الكود الخاص بي.

هل كانت مفيدة؟

المحلول

هيبي سهل الاستخدام للغاية.في مرحلة ما من التعليمات البرمجية الخاصة بك، عليك أن تكتب ما يلي:

from guppy import hpy
h = hpy()
print h.heap()

يمنحك هذا بعض المخرجات مثل هذا:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

يمكنك أيضًا معرفة المكان الذي تتم الإشارة فيه إلى الكائنات والحصول على إحصائيات حول ذلك، ولكن بطريقة ما تكون المستندات المتعلقة بذلك قليلة بعض الشيء.

يوجد أيضًا متصفح رسومي مكتوب باللغة Tk.

نصائح أخرى

وبما أن أحدا لم يذكر ذلك سأشير إلى وحدتي Memory_profiler وهو قادر على طباعة تقرير استخدام الذاكرة سطرًا تلو الآخر ويعمل على نظامي Unix وWindows (يحتاج إلى psutil في هذا الأخير).الإخراج ليس مفصلاً للغاية ولكن الهدف هو إعطائك نظرة عامة على المكان الذي يستهلك فيه الكود المزيد من الذاكرة وليس تحليلًا شاملاً للكائنات المخصصة.

بعد تزيين وظيفتك مع @profile وتشغيل التعليمات البرمجية الخاصة بك مع -m memory_profiler ضع علامة على أنه سيطبع تقريرًا سطرًا بسطر مثل هذا:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

أوصي قنقن.من السهل جدًا إعداده، ولن تحتاج إلى أي تغييرات على الكود الخاص بك.يمكنك عرض أعداد الكائنات من كل نوع عبر الزمن، وعرض قائمة الكائنات الحية، وعرض المراجع إلى الكائنات الحية، كل ذلك من واجهة الويب البسيطة.

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

يمكنك استيراد memdebug، واستدعاء memdebug.start.هذا كل شئ.

لم أجرب PySizer أو Heapy.وسأكون ممتنا لمراجعات الآخرين.

تحديث

الكود أعلاه مخصص لـ CherryPy 2.X, CherryPy 3.X ال server.quickstart تمت إزالة الطريقة و engine.start لا يأخذ blocking علَم.لذلك إذا كنت تستخدم CherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

النظر في objgraph المكتبة (انظر http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks على سبيل المثال حالة الاستخدام).

مابي هو (آخر) ملف تعريف استخدام الذاكرة لبيثون.ينصب تركيز مجموعة الأدوات هذه على تحديد حالات تسرب الذاكرة.

يحاول Muppy مساعدة المطورين على تحديد تسرب الذاكرة لتطبيقات Python.فهو يتيح تتبع استخدام الذاكرة أثناء وقت التشغيل وتحديد الكائنات التي تتسرب.بالإضافة إلى ذلك، يتم توفير الأدوات التي تسمح بتحديد مصدر الكائنات التي لم يتم إصدارها.

وجدت meliae لتكون أكثر وظيفية بكثير من Heapy أو PySizer.إذا كنت تقوم بتشغيل تطبيق ويب wsgi، إذن البلدوزر عبارة عن غلاف وسيط لطيف لـ Dowser

أقوم بتطوير ملف تعريف الذاكرة لـ Python يسمى memprof:

http://jmdana.github.io/memprof/

يسمح لك بتسجيل وتخطيط استخدام الذاكرة للمتغيرات الخاصة بك أثناء تنفيذ الأساليب المزخرفة.عليك فقط استيراد المكتبة باستخدام:

from memprof import memprof

وتزيين طريقتك باستخدام:

@memprof

وهذا مثال على كيفية ظهور المؤامرات:

enter image description here

تتم استضافة المشروع في جيثب:

https://github.com/jmdana/memprof

حاول أيضًا مشروع بيتراسيمالوك والذي يوفر استخدام الذاكرة لكل رقم سطر بايثون.

تحرير (2014/04):أصبح لديه الآن واجهة المستخدم الرسومية Qt لتحليل اللقطات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top