2011-02-12 10 views
13

मैंने here पढ़ा है कि matplotlib बड़े डेटा सेट को संभालने में अच्छा है। मैं डेटा प्रसंस्करण अनुप्रयोग लिख रहा हूं और मैक्सप्लोटिब प्लॉट को डब्ल्यूएक्स में एम्बेडेड किया है और गति के संदर्भ में और स्मृति के मामले में डेटा की बड़ी मात्रा को संभालने में मैटलप्लिब को ट्रिबिल पाया है। क्या किसी को आपके इनपुट को कम करने के अलावा मैप्लोट्लिब को गति देने (स्मृति पदचिह्न को कम करने) का तरीका पता है?Matplotlib गति?

इसे समझने के लिए कितना बुरा matplotlib स्मृति के साथ इस कोड पर विचार करें:

import pylab 
import numpy 
a = numpy.arange(int(1e7)) # only 10,000,000 32-bit integers (~40 Mb in memory) 
# watch your system memory now... 
pylab.plot(a) # this uses over 230 ADDITIONAL Mb of memory 
+7

मैंने हमेशा डाउनसमल्ड किया है। आपको ग्राफ पर 10 एम अंक प्रस्तुत करने की कोशिश करने की आवश्यकता क्यों होगी? – Paul

+1

matplotlib धीमा है। यह एक ज्ञात तथ्य है। Qt के लिए मैं guiqwt पैकेज का उपयोग करता हूं, शायद Wx के लिए ऐसा कुछ भी है। – tillsten

+1

@paul मैं बस अपने उपयोगकर्ताओं के लिए ग्राफिक रूप से डेटा का पता लगाने के लिए आसान बनाना चाहता था। यानी जब वे ज़ूम करते हैं, तो मैं उनके ज़ूम सीमाओं के आधार पर फिर से दोहराना नहीं चाहता था, वे वास्तविक डेटा देखेंगे चाहे वे ज़ूम/पॅन किए गए हों। –

उत्तर

4

downsampling यहाँ एक अच्छा समाधान है - 10M स्थानों की प्लॉटिंग matplotlib में स्मृति और समय की एक गुच्छा खपत करता है। यदि आप जानते हैं कि कितनी मेमोरी स्वीकार्य है, तो आप उस राशि के आधार पर डाउनसमूल कर सकते हैं। उदाहरण के लिए, 1 मी अंक मान लीजिए स्मृति के 23 अतिरिक्त एमबी लेता है और आप इसे स्थान और समय के संदर्भ में स्वीकार किए जाने की मिल जाए, इसलिए आप ऐसा downsample चाहिए कि यह हमेशा 1M अंक नीचे है:

if(len(a) > 1M): 
    a = scipy.signal.decimate(a, int(len(a)/1M)+1) 
pylab.plot(a) 

या कुछ की तरह ऊपर स्निपेट (। ऊपर अपने स्वाद के लिए भी आक्रामक तरीके से downsample सकता है)

+1

एक साधारण decimation अपर्याप्त है, और मैटलप्लिब आंतरिक रूप से क्या करता है जैसा कि मैं बता सकता हूं। कारण मैं बस decimation नहीं करना चाहता, यह है कि आप प्रत्येक decimation अंतराल में चरम मूल्य खो देते हैं। यदि सिग्नल एक अंतराल के भीतर एक तेज स्पाइक था, तो आप इसे साजिश पर तब तक नहीं देख पाएंगे जबतक कि आप अंतराल के साथ बहुत भाग्यशाली नहीं थे। मैंने कुछ कोड लिखा है जो अंतःक्रियात्मक रूप से करता है, अंतराल (या किनारे) के केंद्र में मूल्य के बजाय प्रत्येक दशमलव अंतराल के चरम मूल्यों को लेता है। मैं आपका जवाब स्वीकार कर रहा हूं हालांकि यह प्रिंसिपल में है जो मैंने किया था। –

+4

डेविड - अगर आपने इसे 'अधिक बुद्धिमानी से हल किया' तो क्या आप साझा करना चाहते हैं? आप अपने स्वयं के उत्तरों को 'हल' के रूप में चिह्नित कर सकते हैं और कुछ अप वोट प्राप्त कर सकते हैं ... – danodonovan

+0

@ डेव: यह भी रुचि है कि आपने इसे कैसे हल किया –

1

मैं भी इतनी बार चरम मानों में दिलचस्पी रखता हूँ, डेटा की बड़ी मात्रा की साजिश रचने से पहले, मैं इस तरह से आगे बढ़ना:

import numpy as np 

s = np.random.normal(size=(1e7,)) 
decimation_factor = 10 
s = np.max(s.reshape(-1,decimation_factor),axis=1) 

# To check the final size 
s.shape 

बेशक np.max जू है चरम गणना समारोह का एक उदाहरण है।

पीएस numpy "स्ट्रिप्स ट्रिक्स" के साथ reshape के दौरान डेटा कॉपी करने से बचना संभव होना चाहिए।