加快读取和操作30,000个CSV文件的速度

问题描述

我正在使用Python 3和pandas(pd.read_csv)读取文件。没有标题,分隔符为'|,| |。 '。另外,这些文件不是.csv文件,操作系统是CentOS。

一个文件夹中有30,000个文件,总大小为10GB。每个文件大约有50-100行和1500列。我读取了每个csv文件(使用read_csv),对该文件进行了一些操作,然后通过for循环将它们存储在列表中。在过程的最后,我有一个数据帧列表。 我想知道如何加快这一过程。 只有10列相关,因此我使用usecols参数进行过滤。单元格输入是字符串,因此我使用df.astype(float)将其转换为float。

请注意,我必须分别对每个文件进行操作,然后再将它们全部附加在一起。

我尝试使用modin,但是导致速度降低了许多。此外,使用modin会导致每个数据帧中的索引重复多次,而普通的熊猫不会发生这种情况。

解决方法

一种方法是使用Dask延迟。 python和pandas的问题在于它将按顺序执行所有操作,这实际上会减慢您的应用程序的速度,尤其是在IO和CPU密集型任务混合使用的情况下。使用Dask,您可以并行化数据的读取和处理,而我要做的一种方法是使用以下代码。

from dask.delayed import delayed
import dask.dataframe as dd
import pandas as pd

file_names = () # Generator with filenames,create your own generator here


@delayed
def read_data(file_name):
    return pd.read_csv(file_name)


@delayed
def process(df):
    # Do the stuff here
    return df


data = [process(read_data(file_name)) for file_name in file_names]
data = dd.compute(data)
print(data)