如何优化大型CSV处理?

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

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. 有没有办法减少读取这个大数据集所需的时间(目前大约 15-20 分钟)?
  2. 由于我在最终输出中只需要大约 3000 行,但在管道期间处理 130 万行,有没有办法通过在过程早期仅加载必要的数据并稍后获取剩余的列来最小化内存使用量?
  3. Pandas 中是否有任何最佳实践或技术可以有效处理大型 CSV 文件,尤其是在最后一步之前不需要大多数列的情况下?
  4. 任何有关如何提高内存效率和性能的建议将不胜感激,特别是如果他们坚持使用 Pandas 或类似的库(因为像 Dask 这样的库在我们的环境中不可用)。
python pandas csv
1个回答
0
投票

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)

希望这有帮助。

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