2011-09-30 15 views
14

साथ फ्लोटिंग प्वाइंट अपवाद मैं PyTables है कि मैं एक क्लस्टर पर पढ़ने का प्रयास कर रहा हूँ द्वारा उत्पन्न एक नहीं बल्कि बड़ी HDF5 फ़ाइल है। मैं न्यूमपी के साथ एक समस्या में भाग रहा हूं क्योंकि मैंने एक व्यक्तिगत खंड में पढ़ा है। के उदाहरण के साथ चलते हैं:Numpy और PyTables

भीतर में HDF5 फ़ाइल है सरणी के कुल आकार,

In [13]: data.shape 
Out[13]: (21933063, 800, 3) 

इस सरणी में प्रत्येक प्रविष्टि एक np.float64 है।

मैं प्रत्येक नोड हो रहा है आकार (21933063,10,3) की स्लाइस पढ़ें। दुर्भाग्य से, NumPy एक ही समय में सभी 21 मिलियन subslices पढ़ने में असमर्थ प्रतीत होता है। मैं आकार (2193306,10,3) के 10 स्लाइस में इन स्लाइस को विभाजित करने और फिर निम्न काम कर बातें प्राप्त करने के लिए कम करने का उपयोग करके यह क्रमिक रूप से करने की कोशिश की है:

In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i*  \ 
     chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)]) 
In [9]: 

जहां 1 <= k <= 10 और chunksize = 2193306। यह कोड k <= 9 के लिए काम करता है; अन्यथा मैं निम्नलिखित मिल:

In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i*  \ 
     chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)]) 
Floating point exception 
[email protected] 00:00:00 ~ 
$ 

मैं वेलग्रिंड के memcheck उपकरण का उपयोग क्या चल रहा है और ऐसा लगता है जैसे कि PyTables दोषी है यह पता लगाने की कोशिश की। ट्रेस में दिखाई देने वाली दो मुख्य फ़ाइलें libhdf5.so.6 और blosc से संबंधित फ़ाइल हैं।

इसके अलावा, कि अगर मैं k=8 है, मैं पाने पर ध्यान दें:

In [12]: a.shape 
Out[12]: (17546448, 10, 3) 

लेकिन अगर मैं पिछले subslice संलग्न, मैं मिलता है:

In [14]: a = np.append(a,np.array(data[8*chunksize:9*chunksize,:10], \ 
     dtype=np.float64)) 
In [15]: a.shape 
Out[15]: (592192620,) 

किसी को क्या करना है की किसी भी विचार है ? धन्यवाद!

+0

क्या है त्रुटि है कि आप जब सीधे एक numpy सरणी में डाटा पढ़ने मिल सकता है? मैं सुझाव दूंगा कि आप कई एरे जोड़कर इसे बनाने की कोशिश करने के बजाय अपने गंतव्य सरणी को प्रीलोकेट करें। – DaveP

उत्तर

1

आप इतनी बड़ी सरणी से पहले (जैसे DaveP पता चलता है) आवंटित करने के लिए कोशिश की?

In [16]: N.empty((21000000,800,3)) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
... 
ValueError: array is too big. 

यह 32 बिट पायथन पर है। आपको वास्तव में 20e6 * 800 * 3 * 8/1e9 = 384 GBy स्मृति की आवश्यकता होगी! एक Float64 8 बाइट की जरूरत है। क्या आपको वास्तव में एक बार में पूरी सरणी की आवश्यकता है?

क्षमा करें, ठीक से पोस्ट पढ़ नहीं किया।

कश्मीर = 8 subslices साथ आपका सरणी पहले से ही लगभग 4.1 Gbyte बड़ा है। शायद यह समस्या है?

यह काम करता है अगर आप पिछले आयाम के लिए केवल के बजाय का उपयोग करें?

एक और सुझाव है, मैं सरणी आकार बदलने के लिए पहले की कोशिश करेगा, तो यह भरने अप:

a = zeros((4,8,3)) 
a = resize(a, (8,8,3)) 
a[4:] = ones((4,8,3))