将大型CSV转换为HDF5

发布于 2021-01-29 18:16:16

我有一个100M的CSV文件(实际上是许多单独的CSV文件),总计84GB。我需要将其转换为具有单个float数据集的HDF5文件。我在测试中使用
h5py 时没有任何问题,但是现在我无法在没有内存不足的情况下完成最终数据集。

如何在不必将整个数据集存储在内存中的情况下写入HDF5?我期望这里有实际的代码,因为它应该很简单。

我只是在研究 pytables ,但看起来数组类(与HDF5数据集相对应)不能被迭代地写入。同样, pandas在中
具有read_csvto_hdf方法io_tools,但是我无法一次加载整个数据集,因此无法正常工作。也许您可以使用pytables或pandas中的其他工具来帮助我正确解决问题。

关注者
0
被浏览
203
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    用于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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看