代码之家  ›  专栏  ›  技术社区  ›  Gaurav Singhal

在Jupyter Windows上使用池并行读取多个文件需要花费很长时间:

  •  1
  • Gaurav Singhal  · 技术社区  · 7 年前

    我想读取22个文件(存储在硬盘上),每个文件大约有300000行存储在一个单独的文件中 pandas 数据帧。我的代码可以在15-25分钟内完成。我最初的想法是:我应该使用更多的CPU来加快速度。( 如果我在这里是错的,请纠正我,如果所有CPU都不能同时从同一硬盘读取数据,但是,在这种情况下,我们可以假定以后数据可能出现在不同的硬盘上,因此这个练习仍然有用 )

    我发现很少有像这样的帖子 this this 并尝试了下面的代码。

    import os
    import pandas as pd
    from multiprocessing import Pool
    
    def read_psv(filename):
        'reads one row of a file (pipe delimited) to a pandas dataframe'
        return pd.read_csv(filename,
                           delimiter='|',
                           skiprows=1, #need this as first row is junk
                           nrows=1, #Just one row for faster testing                    
                           encoding = "ISO-8859-1", #need this as well                       
                           low_memory=False
                          )
    
    
    
    files = os.listdir('.') #getting all files, will use glob later
    df1 = pd.concat((read_psv(f) for f in files[0:6]), ignore_index=True, axis=0, sort=False) #takes less than 1 second
    
    pool = Pool(processes=3)
    df_list = pool.map(read_psv, files[0:6]) #takes forever
    #df2 =  pd.concat(df_list, ignore_index=True) #cant reach this 
    

    这需要花费很长时间(超过30-60分钟,但在我结束这个过程时没有完成)。我也经历过 similar question like mine 但是没有用。

    编辑: 我在窗户上用jupyter。

    2 回复  |  直到 7 年前
        1
  •  1
  •   fafl    7 年前

    你的任务是IO限制的,瓶颈是硬盘。CPU只需要做一点工作来解析csv中的每一行。

    如果按顺序读取,则磁盘读取速度最快。如果您想读取一个大文件,最好让磁盘寻找开始,然后按顺序读取它的所有字节。

    如果在同一硬盘上有多个大文件,并且使用多个进程从中读取,那么磁盘头必须在它们之间来回跳跃,每次跳跃需要10毫秒。

    多处理仍然可以使代码更快,但您需要将文件存储在多个磁盘上,这样每个磁盘头都可以专注于读取一个文件。

    另一种选择是购买固态硬盘。磁盘搜索时间在0.1 ms时要低得多,吞吐量大约快5倍。

        2
  •  0
  •   Gaurav Singhal    7 年前

    所以这个问题与 不良表现 或者卡在I/O上。问题与Jupyter和Windows有关。在Windows上,我们需要包含这样的if子句: if __name__ = '__main__': 在初始化池之前。对于jupyter,我们需要将工作者保存在一个单独的文件中,并将其导入代码中。Jupyter也有问题,因为它默认不提供错误日志。当我在Python外壳上运行代码时,我了解了Windows的问题。在ipython shell上运行代码时,我了解了jupyter错误。跟随这篇文章对我有很大帮助。

    For Jupyter

    For Windows Issue

    推荐文章