कौन से पायथन मेमोरी प्रोफाइलर की सिफारिश की जाती है? [बन्द है]


670

मैं अपने पायथन एप्लिकेशन के मेमोरी उपयोग को जानना चाहता हूं और विशेष रूप से जानना चाहता हूं कि कौन से कोड ब्लॉक / भाग या ऑब्जेक्ट सबसे अधिक मेमोरी का उपभोग कर रहे हैं। Google खोज से पता चलता है कि एक व्यावसायिक पायथन मेमोरी वैलिडेटर (केवल विंडोज) है।

और ओपन सोर्स वाले PySizer और Heapy हैं

मैंने किसी की कोशिश नहीं की है, इसलिए मैं जानना चाहता हूं कि कौन सा सबसे अच्छा विचार है:

  1. अधिकांश विवरण देता है।

  2. मुझे अपने कोड में कम से कम या कोई बदलाव नहीं करना है।


2
लीक के स्रोतों को खोजने के लिए मैं objgraph की सलाह देता हूं।
पी।

9
@MikeiLL इन जैसे प्रश्नों के लिए एक जगह है: सॉफ्टवेयर सिफारिशें
Poik

2
यह अक्सर पर्याप्त हो रहा है कि हमें एक प्रश्न को दूसरे मंच पर स्थानांतरित करने में सक्षम होना चाहिए।
ज़ुम्बा

एक टिप: यदि कोई गाए का उपयोग करता है और मेमोरी उपयोग की जांच करना चाहता है - यह एक बड़ा सिरदर्द है, क्योंकि उन उपकरणों ने कुछ भी आउटपुट नहीं किया या घटना शुरू नहीं हुई। यदि आप कुछ छोटा परीक्षण करना चाहते हैं, तो उस फ़ंक्शन को स्थानांतरित करें जिसे आप अलग फ़ाइल पर परीक्षण करना चाहते हैं, और अकेले इस फ़ाइल को चलाएं।
एलेक्सा 8

4
मैं
zzzeek

जवाबों:


288

Heapy उपयोग करने के लिए काफी सरल है। अपने कोड के कुछ बिंदु पर, आपको निम्नलिखित लिखना होगा:

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 में लिखा गया है।


24
यदि आप पायथन 2.7 पर हैं, तो आपको इसके ट्रंक संस्करण की आवश्यकता हो सकती है: sourceforge.net/tracker/… ,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
जेम्स स्नाइडर

27
हेप्पी डॉक्स ... अच्छे नहीं हैं। लेकिन मैंने इस ब्लॉग पोस्ट को शुरू करने के लिए बहुत उपयोगी पाया: smira.ru/wp-content/uploads/2011/08/heapy.html
जो शॉ

4
ध्यान दें, हेप्पी में अजगर एक्सटेंशन में आवंटित मेमोरी शामिल नहीं है। यदि किसी ने boost::pythonवस्तुओं को शामिल करने के लिए हिचकी लाने के लिए एक तंत्र पर काम किया है , तो कुछ उदाहरणों को देखना अच्छा होगा!
जूल

34
2014-07-06 के अनुसार, गप्पी पायथन 3 का समर्थन नहीं करता है
क्वेंटिन प्रदेट

5
गप्पी का एक कांटा है जो पायथन 3 का समर्थन करता है जिसे गप्पी 3 कहा जाता है।
डेविड फोस्टर

385

चूंकि किसी ने इसका उल्लेख नहीं किया है, मैं अपने मॉड्यूल मैमोरी_प्रिफ़ाइलर को इंगित करूंगा जो मेमोरी उपयोग की लाइन-बाय-लाइन रिपोर्ट को प्रिंट करने में सक्षम है और यूनिक्स और विंडोज पर काम करता है (पिछले एक पर 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

1
मेरे usecase के लिए - एक सरल छवि हेरफेर स्क्रिप्ट, एक जटिल प्रणाली नहीं है, जो कि कुछ श्रोताओं को खुला छोड़ने के लिए हुआ - यह सबसे अच्छा समाधान था। आपके कोड में जोड़ा गया न्यूनतम गंक के साथ क्या हो रहा है, यह पता लगाने के लिए बहुत आसान है। त्वरित सुधार के लिए बिल्कुल सही और शायद अन्य अनुप्रयोगों के लिए भी बढ़िया।
ड्रिफ्टकैचर

10
मुझे लगता है कि memory_profiler वास्तव में सरल और उपयोग में आसान है। मैं प्रति पंक्ति प्रोफाइलिंग करना चाहता हूं न कि प्रति ऑब्जेक्ट। लिखने के लिए धन्यवाद्।
tommy.carstensen

1
@FabianPedregosa कैसे डोज़ मेमोरी_प्रोफाइलर लूप्स को हैंडल करता है, क्या यह आइडेंटिफायर लूप इट्रीशन नंबर हो सकता है?
ग्लेन फ्लेचर

3
जब यह लाइन-बाय-लाइन राशि की रिपोर्ट करने की कोशिश करता है और यह डुप्लिकेट की गई लाइनों को खोजता है, तो यह केवल अनुमानित रूप से छोरों की पहचान करता है। उस मामले में यह सभी पुनरावृत्तियों का अधिकतम लाभ लेगा।
फेबियन पेड्रिगोसा

1
@FabianPedregosa क्या memory_profilerइसका आउटपुट बफ़र करता है ? मैं कुछ गलत कर रहा हूं, लेकिन ऐसा लगता है कि जब यह पूरा हो जाता है तो किसी फ़ंक्शन के लिए प्रोफ़ाइल को डंप करने के बजाय, यह स्क्रिप्ट के समाप्त होने की प्रतीक्षा करता है।
ग्रीनस्टिक जूल

80

मैं डॉजर की सलाह देता हूं । इसे सेटअप करना बहुत आसान है, और आपको अपने कोड में शून्य परिवर्तन की आवश्यकता है। आप समय के माध्यम से प्रत्येक प्रकार की वस्तुओं की गिनती देख सकते हैं, जीवित वस्तुओं की सूची देख सकते हैं, जीवित वस्तुओं के संदर्भ देख सकते हैं, सभी सरल वेब इंटरफ़ेस से।

# 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.Xserver.quickstartengine.startblockingCherryPy 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()

3
लेकिन यह केवल चेरी के लिए है, इसे एक पापुलर स्क्रिप्ट के साथ कैसे उपयोग किया जाए?
अनुराग उनियाल

13
यह चेरीपी के लिए नहीं है। जीयूआई टूलकिट के रूप में चेरीपी के बारे में सोचें।
sanxiyn

1
fwiw, pysizer पेज pysizer.8325.org लगता है कि उसे हिचकी की सलाह दी जाती है, जो कहती है कि यह समान है
याकूब गेब्रियलसन

6
डॉजर नामक डोजर का एक सामान्य WSGI पोर्ट है, जिसे आप अन्य वेब सर्वरों के साथ भी उपयोग कर सकते हैं: pypi.python.org/pypi/Dozer
जो शॉ

2
cherrypy 3.1 ने cherrypy.server.quickstart () को हटा दिया, इसलिए बस cherrypy.engine.start () का उपयोग करें
MatsLindh

66

ऑबजर्ग लाइब्रेरी पर विचार करें (देखेंhttp://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks एक उदाहरण के उपयोग के लिए)।


7
objgraph ने मुझे आज एक स्मृति रिसाव समस्या को हल करने में मदद की जिसका मैं सामना कर रहा था। objgraph.show_growth () विशेष रूप से उपयोगी था
Ngure Nyaga

1
मैं भी, वास्तव में उपयोगी objgraph पाया। आप यह objgraph.by_type('dict')समझना पसंद कर सकते हैं कि उन सभी अप्रत्याशित dictवस्तुएँ कहाँ से आ रही हैं।
डिनो

18

म्यूप्पी पाइथन के लिए मेमोरी इस् यूज़ प्रॉसेसर है। इस टूलसेट का फोकस मेमोरी लीक की पहचान पर रखा गया है।

मुप्पी डेवलपर्स को पायथन अनुप्रयोगों की मेमोरी लीक की पहचान करने में मदद करने की कोशिश करता है। यह रनटाइम के दौरान मेमोरी उपयोग पर नज़र रखने और लीक होने वाली वस्तुओं की पहचान करने में सक्षम बनाता है। इसके अतिरिक्त, उपकरण प्रदान किए जाते हैं जो जारी की गई वस्तुओं के स्रोत का पता लगाने की अनुमति देते हैं।


13

मैं पायथॉन के लिए एक मेमोरी प्रोफाइलर विकसित कर रहा हूं जिसे मेम्प्रिट कहा जाता है:

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

यह आपको सजाए गए तरीकों के निष्पादन के दौरान अपने चर के मेमोरी उपयोग को लॉग और प्लॉट करने की अनुमति देता है। आपको बस पुस्तकालय का उपयोग करके आयात करना होगा:

from memprof import memprof

और अपनी विधि का उपयोग कर सजाएं:

@memprof

यह एक उदाहरण है कि भूखंड कैसे दिखते हैं:

यहाँ छवि विवरण दर्ज करें

परियोजना GitHub में होस्ट की गई है:

https://github.com/jmdana/memprof


3
मैं इसे कैसे इस्तेमाल करूं? ए, बी, सी क्या है?
tommy.carstensen

@ tommy.carstensen a, bऔर cचर के नाम हैं। आप प्रलेखन को github.com/jmdana/memprof पर पा सकते हैं । यदि आपके पास कोई प्रश्न हैं, तो कृपया बेझिझक एक समस्या को github में सबमिट करें या डाक से आने वाली सूची को एक ईमेल भेजें जो दस्तावेज़ में पाया जा सकता है।
जद्दन

12

मैंने मेलिया को हेपी या पायसीज़र की तुलना में अधिक कार्यात्मक पाया। यदि आप एक wsgi webapp चलाते हैं, तो Dozer Dowser का एक अच्छा मिडलवेयर आवरण है


8

पाइटरमैलोक प्रोजेक्ट भी आज़माएँ जो पायथन लाइन नंबर के अनुसार मेमोरी उपयोग प्रदान करता है।

EDIT (2014/04): स्नैपशॉट का विश्लेषण करने के लिए अब इसमें Qt GUI है।


4
tracemallocअब अजगर मानक पुस्तकालय का हिस्सा है। देखें docs.python.org/3/library/tracemalloc.html
दान Milon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.