2011-08-09 14 views
29

मैं एक बड़े पायथन कोडबेस से, एक समारोह के चलाने के दौरान ढेर उपयोग या स्मृति आवंटन का सारांश उत्पन्न करने के लिए देख रहा हूं।पायथन लाइन-दर-लाइन मेमोरी प्रोफाइलर?

मैं heapy से परिचित हूं, और यह मेरे कोड में विशेष बिंदुओं पर ढेर के "स्नैपशॉट्स" लेने के लिए मुझे अच्छी तरह से सेवा करता है, लेकिन मुझे "मेमोरी-ओवर-टाइम" सारांश उत्पन्न करना मुश्किल हो गया है यह। मैंने line_profiler के साथ भी खेला है, लेकिन यह रन टाइम के साथ काम करता है, स्मृति नहीं।

मेरा फ़ॉलबैक अभी massif के साथ मान्य है, लेकिन उसमें कई पाइथन जानकारी की कमी है जो हेपी और line_profiler दोनों देते हैं। क्या बाद वाले दो के संयोजन का कुछ प्रकार है जो एक पायथन कार्यक्रम के निष्पादन अवधि पर स्मृति उपयोग या ढेर वृद्धि की भावना देता है?

+0

क्या आप इसे http://docs.python.org/devguide/gdb.html के साथ कर सकते हैं, यदि आप सी दुनिया में क्या कर रहे हैं, तो आप क्या कर रहे हैं? – agf

+0

ए सी परिप्रेक्ष्य ठीक होगा, अगर नियमित अंतराल पर स्वचालित रूप से एक जीडीबी चलाने का कोई तरीका था - क्या ऐसी कोई विधि है? – Tim

+1

एक अच्छा सवाल है, मुझे जानने में दिलचस्पी है, इसलिए मैंने एक उपहार दिया। – bgw

उत्तर

13

मैं एक कस्टम ट्रेसर फ़ंक्शन पंजीकृत करने के लिए प्रोग्राम स्टार्टअप पर sys.settrace का उपयोग करूंगा। कोड की प्रत्येक पंक्ति के लिए custom_trace_function कहा जाएगा। फिर आप बाद में प्रसंस्करण के लिए फ़ाइल में हेपी या meliae द्वारा एकत्र की गई जानकारी संग्रहीत करने के लिए उस फ़ंक्शन का उपयोग कर सकते हैं।

import sys 
import time 
import atexit 
from guppy import hpy 

_last_log_time = time.time() 
_logfile = open('logfile.txt', 'w') 

def heapy_profile(frame, event, arg): 
    currtime = time.time() 
    if currtime - _last_log_time < 1: 
     return 
    _last_log_time = currtime 
    code = frame.f_code 
    filename = code.co_filename 
    lineno = code.co_firstlineno 
    idset = hpy().heap() 
    logfile.write('%s %s:%s\n%s\n\n' % (currtime, filename, lineno, idset)) 
    logfile.flush() 

atexit.register(_logfile.close) 
sys.settrace(heapy_profile) 
+1

मैंने कोशिश नहीं की है * अभी तक *, लेकिन ऐसा लगता है कि हम सिर्फ विजेता हो सकते हैं। (यदि कोई और इस प्रश्न को एक कोशिश देना चाहता है तो मैं अंक अर्जित करने के लिए बक्षीस अवधि के अंत तक इंतजार करूंगा) – bgw

4

आप memory_profiler द्वारा रुचि हो सकती है:

यहाँ एक बहुत ही सरल उदाहरण है जो() hpy.heap के उत्पादन में एक सादा पाठ फ़ाइल के लिए प्रत्येक दूसरे लॉग है।

संबंधित मुद्दे