pandas read_csv/excel with concurrent.futures.ProcessPoolExecutor

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

我的电脑上有一个脚本,可以从网络共享驱动器读取文件(.xlsx、.csv)。由于网络的原因,对读取时间的依赖性很高,它可以从 150 秒开始。到 400 秒

我试图加快这个过程,但是我的一个限制是我不能改变格式,所以它必须是 xlsx 格式或 csv。不幸的是,至少现在还不能选择其他格式,例如 HDF5。

这是目前导入文件的方式:

import pandas as pd

df1 = pd.read_csv(r'\...\path_to_file', sep='\t', header=0, 
                                            compression='zip') 
                                           
df2 = pd.read_excel(r'\...\path_to_file', 
                                    skiprows=9, usecols="D:T", na_values='N/A')
                                        
df3 = pd.read_excel(r'\...\path_to_file', 
                                    skiprows=12, usecols="C:M", 
                                         na_values='N/A')

df4 = pd.read_excel(r'\...\path_to_file', 
                                    skiprows=9, usecols="C:P", na_values='N/A')

我已经尝试过(对 concurrent.futures.ProcessPoolExecutor 是如何工作的有很多疑问)concurrent.futures 模块。我会说我看到阅读时间有了显着改善,但这也取决于我之前在网络上提到的。

这是实现:

import concurrent.futures
import pandas as pd

def imp1():
    df1 = pd.read_csv(r'\...\path_to_file', sep='\t', header=0, 
                                            compression='zip') 
    return df1

def imp2():
    df2 = pd.read_excel(r'\...\path_to_file', 
                                    skiprows=9, usecols="D:T", na_values='N/A')
    return df2

def imp3()                                        
    df3 = pd.read_excel(r'\...\path_to_file', 
                                    skiprows=12, usecols="C:M", 
                                         na_values='N/A')
    return df3  

def imp4():
    df4 = pd.read_excel(r'\...\path_to_file', 
                                    skiprows=9, usecols="C:P", na_values='N/A')
    return df4

funct_list = [imp1,imp2,imp3,imp4]

if __name__ == '__main__':
    listalis = []
    with concurrent.futures.ProcessPoolExecutor() as exe:
        for f in funct_list:
            listalis.append(exe.submit(f))
    test = [x.result() for x in concurrent.futures.as_completed(listalis)]
    test1 = test
    df1, df2, df3, df4 = test1

这种性能改进是否与并行加载文件有关?我只是在寻找代码实现对这个用例有意义的确认。

欢迎任何反馈。

谢谢!

pandas concurrent.futures
© www.soinside.com 2019 - 2024. All rights reserved.