2012-09-21 7 views
5

मैं एक विशिष्ट पायथन लिपि के स्मृति उपयोग के बारे में पूरी तरह उलझन में हूं। मुझे लगता है कि मुझे वास्तव में पता नहीं है कि 0 SOके बावजूद कई SO प्रश्न/Answers से उपयोग को कैसे प्रोफ़ाइल बनाना है।पायथन में मेमोरी उपयोग: memory_profiler और guppy के बीच क्या अंतर है?

मेरे प्रश्न हैं: memory_profiler और guppy.hpy के बीच क्या अंतर है? मुझे कोई क्यों बता रहा है कि मैं बड़ी मात्रा में स्मृति का उपयोग कर रहा हूं, और दूसरा मुझे बता रहा है कि मैं नहीं हूं?

मैं pysam के साथ काम कर रहा हूं, जैव सूचना विज्ञान एसएएम/बीएएम फाइलों तक पहुंचने के लिए एक लाइब्रेरी। एसएएम (एएससीआईआई) से बीएएम (बाइनरी) में कनवर्ट करते समय और फ़ाइलों के बीच में हेरफेर करते समय मेरी मुख्य स्क्रिप्ट मेमोरी से जल्दी चल रही है।

मैंने यह समझने के लिए एक छोटा परीक्षण उदाहरण बनाया है कि प्रत्येक चरण में कितनी मेमोरी आवंटित की जाती है।

# test_pysam.py: 

import pysam 
#from guppy import hpy 

TESTFILENAME = ('/projectnb/scv/yannpaul/MAR_CEJ082/' + 
       'test.sam') 
#H = hpy() 

@profile # for memory_profiler 
def samopen(filename): 
# H.setrelheap() 
    samf = pysam.Samfile(filename) 
# print H.heap() 
    pass 


if __name__ == "__main__": 
    samopen(TESTFILENAME) 

memory_profiler (python -m memory_profiler test_pysam.py) निम्न उत्पादन में परिणाम के साथ स्मृति उपयोग निगरानी:

Filename: test_pysam.py 

Line # Mem usage Increment Line Contents 
================================================ 
    10        @profile # for memory_profiler 
    11        def samopen(filename): 
    12  10.48 MB  0.00 MB # print H.setrelheap() 
    13 539.51 MB 529.03 MB  samf = pysam.Samfile(filename) 
    14        # print H.heap() 
    15 539.51 MB  0.00 MB  pass 

फिर @profile डेकोरेटर बाहर टिप्पणी और guppy सम्बंधित लाइन uncommenting, मैं निम्नलिखित निर्गम (python test_pysam.py) मिलती है:

Partition of a set of 3 objects. Total size = 624 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0  1 33  448 72  448 72 types.FrameType 
    1  1 33  88 14  536 86 __builtin__.weakref 
    2  1 33  88 14  624 100 csamtools.Samfile 

लाइन 13 का कुल आकार 52 9.03 एमबी एक मामले में है और दूसरे में 624 बाइट्स। वास्तव में यहाँ क्या चल रहा है? 'test.sam' एक ~ 52 एमबी एसएएम (फिर एक ASCII प्रारूप) फ़ाइल है। pysam में गहरी खुदाई करने के लिए यह थोड़ा मुश्किल है, क्योंकि यह samtools से संबंधित सी पुस्तकालय के चारों ओर एक रैपर है। वास्तव में Samfile क्या है, मुझे लगता है कि मुझे यह जानने में सक्षम होना चाहिए कि इसे बनाने के लिए कितनी मेमोरी आवंटित की जाती है। मेरे बड़े, अधिक जटिल पायथन प्रोग्राम के प्रत्येक चरण के मेमोरी उपयोग को सही ढंग से प्रोफाइल करने के लिए मुझे किस प्रक्रिया का उपयोग करना चाहिए?

+0

ध्यान दें कि 'test.sam' दूसरी पंक्ति पर है क्योंकि यह बहुत लंबा नाम था और एक बार मैंने इसे बदल दिया, मुझे एहसास हुआ कि अगर मैं एक लाइन पर फ़ाइल नाम डालता हूं तो मेरी लाइन नंबर जानकारी बंद हो जाएगी। – Yann

उत्तर

7

memory_profiler और guppy.hpy के बीच क्या अंतर है?

क्या आप ढेर के अपने आंतरिक दृश्य और आपके कार्यक्रम के ओएस के बाहरी दृश्य के बीच अंतर को समझते हैं? (उदाहरण के लिए, जब पाइथन दुभाषिया free को 1 एमबी पर कॉल करता है, तो यह कई कारणों से ओएस को तुरंत या कभी भी 1 एमबी लायक पृष्ठों को वापस नहीं लौटाता है।) यदि आप करते हैं, तो उत्तर बहुत आसान है: memory_profiler आपके स्मृति उपयोग के लिए ओएस पूछ रहा है; गप्पी ढेर संरचनाओं से आंतरिक रूप से बाहर निकल रहा है।

इसके अलावा, memory_profiler में एक फीचर guppy स्वचालित रूप से कोड की प्रत्येक पंक्ति के बाद एक रिपोर्ट मुद्रित करने के लिए आपके फ़ंक्शन का उपयोग नहीं करता है; यह अन्यथा बहुत आसान और आसान है लेकिन कम लचीला है। अगर ऐसा कुछ है जो आप जानते हैं कि आप करना चाहते हैं और memory_profiler ऐसा नहीं लगता है, तो शायद यह नहीं हो सकता है; गप्पी के साथ, शायद यह कर सकते हैं, तो दस्तावेज़ और स्रोत का अध्ययन करें।

मुझे क्यों बता रहा है कि मैं बड़ी मात्रा में स्मृति का उपयोग कर रहा हूं, और दूसरा मुझे बता रहा है कि मैं नहीं हूं?

यह सुनिश्चित करना मुश्किल है, लेकिन यहां कुछ अनुमान हैं; उत्तर एक से अधिक का संयोजन होने की संभावना है:

शायद सैमटोल्स एमएमएपी का उपयोग पूरी तरह से स्मृति में छोटी फ़ाइलों को मैप करने के लिए करता है। इससे फ़ाइल के आकार से आपके पृष्ठ का उपयोग बढ़ जाएगा, लेकिन आपके ढेर के उपयोग में वृद्धि नहीं होगी।

हो सकता है कि सैमटोल्स या पीसम बहुत सारी अस्थायी वस्तुओं को बनाता है जो जल्दी से मुक्त हो जाते हैं। आपके पास बहुत से विखंडन हो सकते हैं (प्रत्येक पृष्ठ पर केवल दो जोड़े लाइव पॉब्जेक्ट्स) हो सकते हैं, या आपके सिस्टम के मॉलोक ने फैसला किया होगा कि इसे आवंटित करने के तरीके के कारण इसे अपने फ्रीलिस्ट में बहुत सारे नोड्स रखना चाहिए, या हो सकता है कि यह पृष्ठ वापस न हो ओएस तक अभी तक, या ओएस के वीएम में पुनः प्राप्त किए गए पृष्ठ पुनः प्राप्त नहीं हो सकते हैं। सटीक कारण अनुमान लगाने के लिए लगभग हमेशा असंभव है; करने के लिए सबसे आसान बात यह मानना ​​है कि मुक्त स्मृति कभी वापस नहीं आती है।

मेरे बड़े, अधिक जटिल पायथन कार्यक्रम के प्रत्येक चरण के मेमोरी उपयोग को सही ढंग से प्रोफाइल करने के लिए मुझे किस प्रक्रिया का उपयोग करना चाहिए?

यदि आप ओएस बिंदु दृश्य से स्मृति उपयोग के बारे में पूछ रहे हैं, तो memory_profiler वही कर रहा है जो आप चाहते हैं। जबकि पीसम में प्रमुख खुदाई मुश्किल हो सकती है, @profile सजावटी के साथ कुछ कार्यों को लपेटना मुश्किल हो सकता है। फिर आपको पता चलेगा कि कौन सी सी कार्य स्मृति के लिए जिम्मेदार हैं; यदि आप किसी भी गहरी खुदाई करना चाहते हैं, तो आपको स्पष्ट रूप से सी स्तर पर प्रोफ़ाइल करना होगा (जब तक सैमटोल्स डॉक्स में या सैमटोल्स समुदाय से जानकारी न हो)।

+0

ग्रेट उत्तर, धन्यवाद। – Yann

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