我有 3 个 40 GB 大小的巨大数据帧,我使用 block 打开它们。然后,我想将它们连接在一起。这是我尝试过的:
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)
但是,当我尝试连接所有文件时,它花费了很长时间。 我想要一些建议来更快/更快地连接所有数据帧。
最佳答案
- CSV/TSV 是一种非常慢的文件格式,未经优化。
- 您可能不需要将整个数据集保留在内存中。您的用例可能不需要对整个组合 (120GB) 数据集进行完全随机的列和行访问。
- (您可以连续处理每一行/ block /组(例如邮政编码、用户 ID 等)吗?例如计算聚合、汇总统计数据、特征?或者您是否需要能够跨列应用任意过滤器(哪些列),或行(哪些列)?例如“获取过去 N 天内使用过服务 X 的所有用户 ID”。您可以根据您的用例选择更高性能的文件格式。有替代文件格式(HDFS、PARQUET 等)有些针对列访问或行访问进行了优化,有些则针对顺序或随机访问进行了优化。还有 PySpark。
- 您不一定需要将数据集合并到一个巨大的 120GB 整体文件中。
- 您说运行时很慢,但很可能您耗尽了内存(在这种情况下,运行时就会消失),因此您首先要检查内存使用情况。
- 您的代码正在尝试读入并存储每个文件的所有 block ,而不是跨三个文件逐 block 处理它们:
对于文件中的文件:... chunks = pd.read_table(file, ... chunksize=10000000)
。请参阅Iterating through files chunk by chunk, in pandas . - 修复此问题后,
chunksize=1e7
参数不是内存块的大小;它只是 block 中的行数。这个值实在是太大了。如果组合数据帧的一行需要 10Kb,那么 1e7 个这样的行的 block 将需要 100Gb(!),这不适用于大多数机器。
- 如果您必须坚持使用 CSV,在三个文件中分别处理一个 block ,然后将其输出写入文件,不要将所有 block 留在内存中。另外减少你的 block 大小(尝试例如 1e5 或更少,并测量内存和运行时的改进)。也不要对其进行硬编码,找出每台机器的合理值,和/或将其设为命令行参数。监控您的内存使用情况。
关于pandas - 有没有更快的方法使用 pandas 连接巨大的数据帧(40GB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840390/