TL;DR: 我正在处理一个大型 CSV(4M 行,510 列),但只需要几千行,所有列都在最后。整个过程需要70多分钟,并且占用大量内存。寻找使用 Pandas 优化工作流程的方法。
我在处理大型 CSV 数据集时遇到一些性能和内存问题。从读取数据集到保存最终 CSV 的整个过程非常耗时且占用内存。虽然我只能在本地计算机上运行它,但我很难让它在 QA 服务器上运行。我希望获得一些有关如何优化此工作流程的建议。
我有一个包含 400 万行和 510 列的数据集。然而,我只需要大约 10 列来完成大部分处理步骤。在该过程的最后,我需要所有 510 列可用于编写最终的 CSV 输出。
使用 Pandas 读取此数据集大约需要 20 分钟。通过分块读取数据,我设法将其缩短至 15 分钟,但这仍然是很长的时间。
读完后,我基于组合键进行重复数据删除,将数据集从 400 万行减少到大约 130 万行。仅此重复数据删除步骤就需要另外 20 分钟。
完成重复数据删除后,我将数据集(130 万行)与另一个包含大约 3000 条记录的较小数据集连接起来。由于连接基于较小的数据集,因此最终结果中我只需要较大数据集中的大约 2950 行。
加入后,我进行一些基本格式化并将结果保存为 CSV。最终输出包含全部 700 列(包括两个数据集中的列),但只有约 3000 行。
1。读取 CSV 时我会使用 usecols 参数
由于最后只需要大约 10 列,我建议最初只加载这些列。当您需要编写最终输出时,您可以稍后加载剩余的列。
cols_needed = ['col1', 'col2', 'col3']
df = pd.read_csv('large_file.csv', usecols=cols_needed, chunksize=100000)
2。使用右连接
当加入较小的数据集(3000 条记录)时,它可能有助于将较大的数据集保留为块,并使用右连接将每个块与较小的数据集连接起来,以便仅保留在较小数据集中找到的那些记录。
small_df = pd.read_csv('small_dataset.csv')
final_chunks = []
for chunk in pd.read_csv('large_file.csv', usecols=cols_needed, chunksize=100000):
joined_chunk = pd.merge(chunk, small_df, on='join_key', how='right')
final_chunks.append(joined_chunk)
final_df = pd.concat(final_chunks, ignore_index=True)
希望这有帮助。