如何使用加载大文件并将其与Python中较小的文件连接?

问题描述 投票:2回答:1

我有一个大文件〜5TB(> 2000列和250毫升行),并希望将其与另一个非常小~10 GB(10列和20行)的文件连接起来。

这是我目前在Python中的方法:

  1. 将较小的文件加载到内存中并设置索引。
  2. 将较大的文件拆分为250个部分,每个部分都适合内存。
  3. 将较大文件(k = 1,...,250)的部分k加载到内存中,根据id字段(索引)设置索引并加入较小的文件。
  4. 将结果保存到磁盘并加载另一部分......

码:

import pandas as pd
small_file = pd.read_csv('small_file.txt', sep='|', header=None,
                     usecols=[0,1,2,3,4,5,6,7,8,9], dtype=column_types_small_file)
small_file.set_index(2, inplace=True)
large_file_part_k= pd.read_csv('large_file_part_k.txt', sep='|', header=None)
large_file_part_k.set_index(2, inplace=True)
merged = pd.merge(small_file, large_file_part_k, how="inner", left_index=True, right_index=True)
merged.to_csv('join_results.csv', mode='a', header=False)

这工作:)但一部分的处理需要约550秒。为什么?将一个部件装入内存需要约450秒。 :(我试图在加载到内存时为所有列定义数据类型,但它更糟糕的是3-4倍。

对于这种特殊情况,您还有其他选择吗?我使用的机器有120 GB内存和32个内核。

python pandas join large-data large-files
1个回答
0
投票

我会考虑将您的文件转换为比CSV更高效的文件格式。例如,您可能需要考虑HD5和Feather文件格式,这样可以提高读/写操作的性能。另请参见this(已关闭)Stackoverflow问题。

© www.soinside.com 2019 - 2024. All rights reserved.