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