【问题标题】:Pandas reading csv into hdfstore thrashes, creates huge file将 csv 读入 hdfstore 的熊猫会崩溃,创建巨大的文件
【发布时间】:2014-04-27 19:26:37
【问题描述】:

作为测试,我正在尝试使用 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 是否无法处理非常宽的列?是否存在我应该截断的阈值?

【问题讨论】:

  • 发布 chunk.head() 和 chunk.dtypes。什么版本的 pandas、python、os、pytables?
  • 这就是问题所在,一切都应该object dtype(除非它是一个字符串)。
  • 虽然我建议将匿名添加为内置 pandas 函数的建议被拒绝,但在这种情况下处理专有数据时,您始终可以尝试将所有整数替换为 0,所有浮点数替换为 1.0,所有带有'a'的字符串等。如果问题仍然存在,那么你有一个框架,你可以在不违反保密性的情况下向我们展示。如果不是,那么您已经帮助缩小了导致问题的范围。
  • 我的问题是我不知道加载时的类型。有什么办法吗?
  • 可以通过df.dtypes访问类型信息,这是一个Series,所以(例如)for col, dtype in df.dtypes.iteritems():会做它看起来的样子。

标签: pandas pytables hdfstore


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2020-12-23
    • 2015-09-08
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多