将大型CSV转换为HDF5
我有一个100M的CSV文件(实际上是许多单独的CSV文件),总计84GB。我需要将其转换为具有单个float数据集的HDF5文件。我在测试中使用
h5py 时没有任何问题,但是现在我无法在没有内存不足的情况下完成最终数据集。
如何在不必将整个数据集存储在内存中的情况下写入HDF5?我期望这里有实际的代码,因为它应该很简单。
我只是在研究 pytables ,但看起来数组类(与HDF5数据集相对应)不能被迭代地写入。同样, pandas在中
具有read_csv
和to_hdf
方法io_tools
,但是我无法一次加载整个数据集,因此无法正常工作。也许您可以使用pytables或pandas中的其他工具来帮助我正确解决问题。
-
用于
append=True
呼叫to_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
请注意,您需要
format='table'
在第一个调用中使用df.to_hdf
以使表可追加。否则,'fixed'
默认情况下为格式,这对于读写来说是更快的,但是会创建一个不能追加的表。因此,您可以一次处理一个CSV,用于
append=True
构建hdf5文件。然后覆盖DataFrame或用于del df
允许对旧DataFrame进行垃圾回收。
另外,
df.to_hdf
您也可以将其附加到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