pandas将csv读入hdfstore thrashes,创建了巨大的文件

时间:2014-03-20 18:10:48

标签: pandas pytables hdfstore

作为测试,我正在尝试使用pandas读取一个小的25毫克csv文件.HDFStore:

store = pd.HDFStore('file.h5',mode='w')
for chunk in read_csv('file.csv',chunksize=50000):
     store.append('df',chunk)
store.close()

它导致我的计算机崩溃,当它最终完成时,file.h5是6.7演出。我不知道是什么导致文件大小膨胀:当我看到商店后,唯一的东西是小数据帧。 如果我在没有分块的情况下读取csv,然后将其添加到商店,我没有问题。

更新1: 我正在运行Anaconda,使用python 2.7.6,HDF5版本1.8.9,numpy 1.8.0,pytables 3.1.0,pandas 13.1,ubuntu 12.04。 数据是专有的,因此我无法在线发布块信息。我确实有一些混合类型。如果我尝试以对象的形式阅读所有内容,它仍然会崩溃。

更新2: 丢弃所有混合类型的列,我仍然遇到同样的问题。我有一些非常大的文本列,如果这有任何区别。

更新3: 问题似乎是将数据帧加载到hdfstore中。我大幅减少了文件的大小,但保留了我的一个非常宽的列(1259个字符)。而csv文件的大小是878.6kb,而hdfstore的大小是53兆。 pytables无法处理非常宽的列?是否存在我应该截断的阈值?

1 个答案:

答案 0 :(得分:0)

宽对象列绝对是个问题。我的解决方案是在读取它们时截断对象列。如果我截断到20个字符的宽度,h5文件只是csv文件的两倍大。但是,如果我截断为100个字符,则h5文件大约为6倍。

我将下面的代码作为答案包含在内,但如果有人知道如何减少这种大小差异而不必截断这么多文本,我将不胜感激。

store = pd.HDFStore(filepath, 'w')
for chunk in pd.read_csv(f, chunksize=5000, sep='\t',
                         na_values="null", error_bad_lines=False):

    chunk = chunk.apply(truncateCol)
    store.append(table, chunk)

def truncateCol(ser, width=100):
    if ser.dtype == np.object:
        ser = ser.str[:width] if ser.str.len().max() > width else ser
    return ser
相关问题