【发布时间】:2019-11-13 15:28:20
【问题描述】:
我有 3 个 40 GB 大小的巨大数据帧,我使用块打开它们。然后,我想将它们连接在一起。这是我尝试过的:
path = 'path/to/myfiles'
files = [os.path.join(path,i) for i in os.listdir(path) if i.endswith('tsv')]
for file in files:
cols = ['col1','col2','col3']
chunks = pd.read_table(file, sep='\t', names=cols, chunksize=10000000)
但是,当我尝试连接所有文件时,它需要很长时间。 我想有一些建议可以更快/更快地连接所有数据帧。
【问题讨论】:
-
您查看过dask 吗?我自己还没有机会使用它,但我听说过这个项目的好消息,而且数据太大而无法放入内存。
-
感谢您的建议!这个我没研究过,会看的。
-
但是您真的需要为您的用例将整个数据帧保存在内存中吗?有其他文件格式(HDFS、PARQUET 等),还有
concat的替代命令。如果您告诉我们您主要需要列访问还是行访问,以及顺序访问还是随机访问,这将很有帮助。 (例如,您可以只串行处理每个(连接的)行,还是跨多列进行任意过滤,还是什么?) -
您还说运行时很慢,但您可能反而会耗尽内存。注意
pd.read_table(..., chunksize=1e7)参数不是内存块的大小;它是块中的行数。用于块的实际内存取决于每个数据帧中一行的大小,因此如果一个组合行占用 10Kb,则尝试使用其中的chunksize=1e7将占用 100Gb,这是巨大的。尝试较低的块大小。此外,您永远不应该将这样的常量硬连线到您的源代码中,尤其是。如果它们会导致您的工作在大多数中型机器上失败。
标签: pandas performance memory concat