यदि आप कई अलग-अलग फ़ंक्शंस कॉल कर रहे हैं तो समस्या से निपटने का एक तरीका और आप अनिश्चित हैं कि स्वैपिंग कहां से आती है, memory_profiler से नई साजिश कार्यक्षमता का उपयोग करना होगा। सबसे पहले आपको @profile के साथ उपयोग किए जा रहे विभिन्न कार्यों को सजाने चाहिए। सादगी के लिए मैं उदाहरण examples/numpy_example.py memory_profiler के साथ भेज दिया कि दो कार्यों में शामिल है का उपयोग करेंगे: बजाय पायथन दुभाषिया के साथ इसे चलाने का अपनी स्क्रिप्ट चलाने के लिए, create_data()
और process_data()
, आप mprof निष्पादन का उपयोग करें, कि
$ mprof run examples/numpy_example.py
है
यह mprofile_??????????.dat
नामक एक फ़ाइल तैयार करेगा, जहां? वर्तमान तारीख का प्रतिनिधित्व करने वाली संख्याएं रखेगी। परिणाम साजिश के लिए, बस टाइप mprof plot
और यह एक साजिश इस के समान उत्पन्न होगा (आप कई .dat फ़ाइलें अगर यह हमेशा पिछले एक ले जाएगा):
यहाँ आप स्मृति की खपत को देखते हैं, जब आप वर्तमान फ़ंक्शन को दर्ज/छोड़ते हैं तो इंगित करने वाले ब्रैकेट के साथ। इस तरह यह देखना आसान है कि फ़ंक्शन process_data()
मेमोरी खपत का एक शीर्ष है। अपने फ़ंक्शन में आगे बढ़ने के लिए, आप अपने फ़ंक्शन में प्रत्येक पंक्ति की मेमोरी खपत देखने के लिए लाइन-बाय-लाइन प्रोफाइलर का उपयोग कर सकते हैं।यह
python -m memory_profiler examples/nump_example.py
साथ चलाया जाता है यह आपको एक उत्पादन इस के समान देना होगा:
Line # Mem usage Increment Line Contents
================================================
13 @profile
14 223.414 MiB 0.000 MiB def process_data(data):
15 414.531 MiB 191.117 MiB data = np.concatenate(data)
16 614.621 MiB 200.090 MiB detrended = scipy.signal.detrend(data, axis=0)
17 614.621 MiB 0.000 MiB return detrended
जहां यह स्पष्ट है कि scipy.signal.detrend स्मृति की एक बड़ी राशि का आवंटन किया गया है।
स्रोत
2013-10-11 07:25:27
नहीं अपने (अच्छा) सवाल है, लेकिन आप निश्चित रूप से की dtype = np.float32/बहुत उपयोग कर सकते हैं। 64-बिट फ्लोट के बजाय 32-बिट के लिए Astype (np.float32)। (उन कार्यों से सावधान रहें जो चुपचाप 32 में करते हैं -> 64 आउट।) – denis