2014-11-29 29 views
19

में कनवर्ट करें मेरे पास 84 जीबी की कुल 100 एम लाइन सीएसवी फ़ाइल (वास्तव में कई अलग सीएसवी फाइलें) हैं। मुझे इसे एक फ्लोट डेटासेट के साथ एक एचडीएफ 5 फाइल में बदलने की जरूरत है। मैंने बिना किसी समस्या के परीक्षण में h5py का उपयोग किया, लेकिन अब मैं स्मृति से बाहर किए बिना अंतिम डेटासेट नहीं कर सकता।बड़े सीएसवी को hdf5

मैं पूरे डेटासेट को मेमोरी में स्टोर किए बिना एचडीएफ 5 पर कैसे लिख सकता हूं? मैं यहां वास्तविक कोड की उम्मीद कर रहा हूं, क्योंकि यह काफी सरल होना चाहिए।

मैं सिर्फ pytables देख रहा था, लेकिन यह सरणी वर्ग (जो एचडीएफ 5 डेटासेट से मेल खाता है) की तरह दिखता नहीं है, इसे क्रमशः लिखा जा सकता है। इसी तरह, पांडा में read_csv और to_hdf इसके io_tools में विधियां हैं, लेकिन मैं एक ही समय में संपूर्ण डेटासेट लोड नहीं कर सकता, जिससे यह काम नहीं करेगा। शायद आप पीईटीबल्स या पांडा में अन्य टूल्स के साथ समस्या को सही ढंग से हल करने में मेरी मदद कर सकते हैं।

उत्तर

25

कॉल में Use append=Trueto_hdf रहे हैं:

import numpy as np 
import pandas as pd 

filename = '/tmp/test.h5' 

df = pd.DataFrame(np.arange(10).reshape((5,2)), columns=['A', 'B']) 
print(df) 
# A B 
# 0 0 1 
# 1 2 3 
# 2 4 5 
# 3 6 7 
# 4 8 9 

# Save to HDF5 
df.to_hdf(filename, 'data', mode='w', format='table') 
del df # allow df to be garbage collected 

# Append more data 
df2 = pd.DataFrame(np.arange(10).reshape((5,2))*10, columns=['A', 'B']) 
df2.to_hdf(filename, 'data', append=True) 

print(pd.read_hdf(filename, 'data')) 

पैदावार

A B 
0 0 1 
1 2 3 
2 4 5 
3 6 7 
4 8 9 
0 0 10 
1 20 30 
2 40 50 
3 60 70 
4 80 90 

ध्यान दें कि आप तालिका appendable बनाने के लिए df.to_hdf करने के लिए पहली कॉल में format='table' उपयोग करने के लिए की जरूरत है। अन्यथा, स्वरूप डिफ़ॉल्ट रूप से 'fixed' है, जो पढ़ने और लिखने के लिए तेज़ है, लेकिन एक टेबल बनाता है जिसे इसमें शामिल नहीं किया जा सकता है।

इस प्रकार, आप एक समय में प्रत्येक सीएसवी को संसाधित कर सकते हैं, hdf5 फ़ाइल बनाने के लिए append=True का उपयोग करें। फिर डेटाफ्रेम को ओवरराइट करें या पुराने डेटाफ्रेम को कचरा एकत्र करने की अनुमति देने के लिए del df का उपयोग करें।


वैकल्पिक रूप से, बजाय df.to_hdf बुलाने की, तो आप कर सकते थे append to a HDFStore:

import numpy as np 
import pandas as pd 

filename = '/tmp/test.h5' 
store = pd.HDFStore(filename) 

for i in range(2): 
    df = pd.DataFrame(np.arange(10).reshape((5,2)) * 10**i, columns=['A', 'B']) 
    store.append('data', df) 

store.close() 

store = pd.HDFStore(filename) 
data = store['data'] 
print(data) 
store.close() 

पैदावार

A B 
0 0 1 
1 2 3 
2 4 5 
3 6 7 
4 8 9 
0 0 10 
1 20 30 
2 40 50 
3 60 70 
4 80 90 
6

यह PyTables के साथ संभव होना चाहिए। हालांकि आपको EArray कक्षा का उपयोग करने की आवश्यकता होगी।

उदाहरण के तौर पर, निम्नलिखित एक स्क्रिप्ट है जिसे मैंने .npy फ़ाइलों को एक .h5 फ़ाइल में संग्रहीत खंडित प्रशिक्षण डेटा आयात करने के लिए लिखा था।

import numpy 
import tables 
import os 

training_data = tables.open_file('nn_training.h5', mode='w') 
a = tables.Float64Atom() 
bl_filter = tables.Filters(5, 'blosc') # fast compressor at a moderate setting 

training_input = training_data.create_earray(training_data.root, 'X', a, 
              (0, 1323), 'Training Input', 
              bl_filter, 4000000) 
training_output = training_data.create_earray(training_data.root, 'Y', a, 
              (0, 27), 'Training Output', 
              bl_filter, 4000000) 

for filename in os.listdir('input'): 
    print "loading {}...".format(filename) 
    a = numpy.load(os.path.join('input', filename)) 
    print "writing to h5" 
    training_input.append(a) 

for filename in os.listdir('output'): 
    print "loading {}...".format(filename) 
    training_output.append(numpy.load(os.path.join('output', filename))) 

एक डेटा जड़ या माता पिता नोड विस्तृत निर्देशों के लिए डॉक्स पर एक नजर डालें, लेकिन बहुत संक्षेप में, create_earray समारोह 1 लेता है); 2) एक सरणी नाम; 3) एक डेटाटाइप परमाणु; 4) उस आयाम में 0 के साथ एक आकार जिसे आप विस्तार करना चाहते हैं; 5) एक verbose वर्णनकर्ता; 6) compression filter; और 7) विस्तारणीय आयाम के साथ पंक्तियों की एक अपेक्षित संख्या। केवल पहले दो की आवश्यकता है, लेकिन आप शायद अभ्यास में सभी सात का उपयोग करेंगे। फ़ंक्शन कुछ अन्य वैकल्पिक तर्क भी स्वीकार करता है; फिर, विवरण के लिए दस्तावेज़ देखें।

एक बार सरणी बनने के बाद, आप इसकी append विधि का उपयोग अपेक्षित तरीके से कर सकते हैं।

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