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



我需要读取数千个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

我建议使用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文件,并将它们连接到单个数据帧中。

df.groupby('id').agg({'col1': 'mean', 'col2': 'max'})将根据id列对数据帧进行分组,然后计算每组的col1的平均值和col2的最大值。

df.to_csv('output.csv')将数据帧写入csv文件。

性能

我在我的机器上用一个包含10000个csv文件的目录进行了测试,每个文件有10000行。代码运行大约需要2分钟。

安装

要安装dask,请运行pip install dask

最新更新