2015-03-23 7 views
8

क्या कोई hdf5 फ़ाइल में सरणी को स्टोर करने का कोई तरीका है, जो स्मृति में लोड करने के लिए बहुत बड़ा है?hdf5 फ़ाइल में एक सरणी को कैसे स्टोर करें जो स्मृति में लोड करने के लिए बहुत बड़ा है?

मैं एक स्मृति त्रुटि मिलती है अगर मैं इस

f = h5py.File('test.hdf5','w') 
f['mydata'] = np.zeros(2**32) 

की तरह कुछ है।

+3

(http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage) [hyperslabs] पर एक नजर डालें। यह संभव है, लेकिन आपको 'भाग' में लिखना चाहिए, और hdf5 फ़ाइल को चंक करने योग्य बनाना चाहिए। – Mathias711

+3

http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage –

उत्तर

6

documentation के अनुसार, आप hdf5 में संग्रहीत एक खंडित सरणी बनाने के लिए create_dataset का उपयोग कर सकते हैं। उदाहरण:

>>> import h5py 
>>> f = h5py.File('test.h5', 'w') 
>>> arr = f.create_dataset('mydata', (2**32,), chunks=True) 
>>> arr 
<HDF5 dataset "mydata": shape (4294967296,), type "<f4"> 

HDF5 dataset रिटर्न Numpy-सरणियों टुकड़ा करने की क्रिया।

>>> arr[:10] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32) 
>>> type(arr[:10]) 
numpy.array 

आप मूल्यों को एक नम्पी-सरणी के रूप में सेट कर सकते हैं।

>>> arr[3:5] = 3 
>>> arr[:6] 
array([ 0., 0., 0., 3., 3., 0.], dtype=float32) 

मुझे नहीं पता कि यह सबसे प्रभावी तरीका है, लेकिन आप भाग में पूरी सरणी पर फिर से सक्रिय कर सकते हैं। और यह यादृच्छिक मान के लिए सेटिंग उदाहरण के लिए:

>>> import numpy as np 
>>> for i in range(0, arr.size, arr.chunks[0]): 
     arr[i: i+arr.chunks[0]] = np.random.randn(arr.chunks[0]) 
>>> arr[:5] 
array([ 0.62833798, 0.03631227, 2.00691652, -0.16631022, 0.07727782], dtype=float32) 
+0

क्या होगा यदि डेटासेट आकार पहले से ज्ञात नहीं है? क्या यह संलग्न मोड में किया जा सकता है? – mrgloom

+0

@mrgloom शायद यह आपकी आवश्यकताओं के अनुरूप है? https://stackoverflow.com/a/25656175/3635816 – RickardSjogren

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