Pandas 熊猫将csv读取到hdfstore中,会产生巨大的文件

Pandas 熊猫将csv读取到hdfstore中,会产生巨大的文件,pandas,pytables,hdfstore,Pandas,Pytables,Hdfstore,作为测试,我尝试使用pandas.HDFStore读取一个25 mg的小csv文件: 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 gigs。我不知道是什么导致文件大小膨胀:当我事后查看存储时,其中唯一的东西就是小

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

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 gigs。我不知道是什么导致文件大小膨胀:当我事后查看存储时,其中唯一的东西就是小数据帧。 如果我在没有分块的情况下读取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是否无法处理非常宽的列?是否有一个阈值需要截断?

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

发布chunk.head()和chunk.dtypes。什么版本的pandas、python、os、pytables?这就是问题所在,所有内容都不应该是
object
dtype(除非是字符串)。虽然我关于将匿名添加为内置pandas函数的建议被拒绝,但在这种情况下处理专有数据时,您始终可以尝试将所有整数替换为0,将所有浮点替换为1.0,所有带“a”的字符串,等等。如果问题仍然存在,那么您已经有了一个框架,可以在不违反保密性的情况下显示给我们。如果没有,那么您已经帮助缩小了导致问题的原因。我的问题是,我不知道加载时的类型。任何解决方法?可以通过
df.dtypes
访问类型信息,这是一个
系列
,因此(例如)
对于col,df.dtypes.iteritems()中的dtype:
执行它看起来的操作。