Pandas将csv读入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()

它导致我的电脑抖动,当它最终完成时,文件。H5是6.7 g。我不知道是什么原因导致文件大小膨胀:当我随后查看存储时,那里唯一的东西就是小数据框。如果我在不分组的情况下读取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 mb。pytables不能处理非常宽的列吗?是否存在我应该截断的阈值?

宽对象列肯定是问题所在。我的解决方案是在读取它们时截断对象列。如果我截断到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

最新更新