h5py

2014-09-04 15 views
10

के साथ hdf5 को incremental लिखता है मुझे यह प्रश्न है कि python/h5py के साथ hdf5 फ़ाइलों को कैसे लिखना है। के बारे में 10^4 कॉलम, और लगभग 10^7 पंक्तियों के साथh5py

----------------------------------------- 
| timepoint | voltage1 | voltage2 | ... 
----------------------------------------- 
| 178  | 10  | 12  | ... 
----------------------------------------- 
| 179  | 12  | 11  | ... 
----------------------------------------- 
| 185  | 9  | 12  | ... 
----------------------------------------- 
| 187  | 15  | 12  | ... 
        ... 

:

मैं की तरह डेटा है। (यह लगभग 10^11 (100 अरब) तत्व है, या ~ बाइट इनट के साथ ~ 100 जीबी)।

इस डेटा के साथ, सामान्य उपयोग एक बार बहुत अधिक लिखता है, कई बार पढ़ता है, और सामान्य पठन केस कॉलम 1 और एक और कॉलम (254 कहें) को पकड़ने के लिए होगा, दोनों स्तंभों को स्मृति में लोड करें, और कुछ फैंसी आंकड़े करें ।

मुझे लगता है कि उपरोक्त तालिका में प्रत्येक कॉलम एक एचडीएफ 5 समूह होगा, जिसके परिणामस्वरूप 10^4 समूह होंगे। इस तरह हमें सभी डेटा को स्मृति में पढ़ने की आवश्यकता नहीं होगी, हां? एचडीएफ 5 संरचना अभी तक परिभाषित नहीं है, इसलिए यह कुछ भी हो सकता है।

अब प्रश्न: मुझे एक समय में डेटा ~ 10^4 पंक्तियां प्राप्त होती हैं (और प्रत्येक बार पंक्तियों की समान संख्या नहीं), और इसे HDF5 फ़ाइल में वृद्धिशील रूप से लिखने की आवश्यकता होती है। मैं उस फाइल को कैसे लिखूं?

मैं अजगर और h5py पर विचार कर रहा हूं, लेकिन अगर कोई अन्य उपकरण अनुशंसित हो सकता है। जाने के रास्ते को तोड़ रहा है, उदाहरण के साथ

dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype='i8', chunks=(10000,)) 

और फिर जब 10^4 पंक्तियों का एक और ब्लॉक आता है, तो डेटासेट को प्रतिस्थापित करें?

या क्या यह अलग-अलग डेटासेट के रूप में 10^4 पंक्तियों के प्रत्येक ब्लॉक को स्टोर करना बेहतर है? या क्या मुझे वास्तव में पंक्तियों की अंतिम संख्या जानने की ज़रूरत है? (यह पाने के लिए मुश्किल हो जाएगा, लेकिन शायद संभव है)।

अगर मैं नौकरी के लिए सही उपकरण नहीं हूं तो मैं hdf5 पर जमानत कर सकता हूं, हालांकि मुझे लगता है कि एक बार अजीब लिखने के बाद, यह अद्भुत होगा।

उत्तर

13

Per the FAQ, आप dset.resize का उपयोग कर डेटासेट का विस्तार कर सकते हैं। उदाहरण के लिए,

import os 
import h5py 
import numpy as np 
path = '/tmp/out.h5' 
os.remove(path) 
with h5py.File(path, "a") as f: 
    dset = f.create_dataset('voltage284', (10**5,), maxshape=(None,), 
          dtype='i8', chunks=(10**4,)) 
    dset[:] = np.random.random(dset.shape)   
    print(dset.shape) 
    # (100000,) 

    for i in range(3): 
     dset.resize(dset.shape[0]+10**4, axis=0) 
     dset[-10**4:] = np.random.random(10**4) 
     print(dset.shape) 
     # (110000,) 
     # (120000,) 
     # (130000,) 
+0

dtype = 'i8' एक चीज़ है? मुझे लगता है कि 'int8' 8 बिट्स है, लेकिन i8 बड़ा लगता है। – user116293

+1

'i8' 8-बाइट इंट्स के लिए हैं। आप 'np.dtype ('i8') का उपयोग करके बाइट आकार की जांच कर सकते हैं। Itemize'। यदि आप 1-बाइट इनट्स चाहते हैं, तो 'np.int8' (उर्फ' 'i1'') का उपयोग करें। – unutbu

3

रूप @unutbu ने कहा, dset.resize एक शानदार विकल्प है। pandas और इसके HDF5 समर्थन को देखने के लिए यह काम हो सकता है जो आपके वर्कफ़्लो को उपयोगी हो सकता है। ऐसा लगता है कि आपकी जरूरतों के मुताबिक एचडीएफ 5 उचित विकल्प है लेकिन यह संभव है कि आपकी समस्या शीर्ष पर एक अतिरिक्त परत का उपयोग करके बेहतर व्यक्त की जा सके।

विचार करने की एक बड़ी बात डेटा का अभिविन्यास है। यदि आप मुख्य रूप से पढ़ने में रूचि रखते हैं, और आप मुख्य रूप से कॉलम द्वारा डेटा ला रहे हैं, तो ऐसा लगता है कि आप डेटा को ट्रांसफर करना चाहते हैं जैसे कि पंक्तियां एचडीएफ 5 स्टोर्स के रूप में पंक्ति-मुख्य क्रम में हो सकती हैं।

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