在Python中使用有限的RAM阅读和处理多个csv文件

noj0wjuj  于 2022-12-06  发布在  Python
关注(0)|答案(1)|浏览(125)

我需要读取数千个csv文件,并在Python中将它们输出为单个csv文件。
每个原始文件都将用于在最终输出中创建单行,其中列是对原始文件的行的某种操作。
由于文件的合并大小,这需要花费许多小时来处理,并且也不能完全加载到内存中。
我可以读入每一个csv并将其从内存中删除以解决RAM问题。但是,我目前正在迭代地阅读和处理每一个csv(在Pandas中),并将输出行附加到最终的csv,这看起来很慢。我相信我可以使用多处理库让每个进程读取和处理自己的csv,但不确定是否有比这更好的方法。
在有RAM限制的情况下,用Python完成这个任务的最快方法是什么?
例如,ABC.csv和DEF.csv将被读取并处理到最终输出csv中的单独行中。(实际文件将有数十列和数十万行)
ABC.csv:

id,col1,col2
abc,2.3,3
abc,3.7,5
abc,3.0,9

DEF.csv:

id,col1,col2
def,1.9,3
def,2.8,2
def,1.6,1

最终输出:

id,col1_avg,col2_max
abc,3.0,9
def,2.1,3
4uqofj5v

4uqofj5v1#

我建议使用dask,它是一个允许对大型数据集进行并行处理的库。

import dask.dataframe as dd

df = dd.read_csv('*.csv')
df = df.groupby('id').agg({'col1': 'mean', 'col2': 'max'})
df.to_csv('output.csv')

代码说明

dd.read_csv将读取当前目录中的所有csv文件,并将它们连接到单个 Dataframe 中。
df.groupby('id').agg({'col1': 'mean', 'col2': 'max'})将按id列对 Dataframe 进行分组,然后计算每组的col1的平均值和col2
df.to_csv('output.csv')会将 Dataframe 写入csv文件。

性能

我在我的机器上测试了这个程序,其中一个目录包含10,000个csv文件,每个文件有10,000行。

安装

要安装dask,请运行pip install dask

相关问题