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

Posted

技术标签:

【中文标题】在 Jupyter Windows 上使用 pool 并行读取多个文件需要很长时间:【英文标题】:Using pool to read multiple files in parallel takes forever on Jupyter Windows: 【发布时间】:2019-04-22 23:54:36 【问题描述】:

我想读取 22 个文件(存储在我的硬盘上),每个文件大约 300,000 行,以存储在单个 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,但没用。

编辑:我在 Windows 上使用 Jupyter。

【问题讨论】:

我明白为什么它会一直运行下去。我在 Windows 上使用此代码,它需要在 if __name__ = '__main__': 子句中定义 pool。否则会产生运行时错误。有关更多详细信息,请参阅此内容。 ***.com/questions/20222534/… 【参考方案1】:

您的任务是受 IO 限制的,瓶颈是硬盘驱动器。 CPU 只需做一点工作即可解析 CSV 中的每一行。

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

如果您在同一个硬盘驱动器上有多个大文件并使用多个进程读取它们,那么磁头将不得不在它们之间来回跳转,每次跳转最多需要 10 毫秒。

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

另一种选择是购买 SSD。磁盘寻道时间大大缩短为 0.1 毫秒,吞吐量提高了约 5 倍。

【讨论】:

感谢您的回答。我的硬盘只有SSD。此外,将来我可能会在多个硬盘上执行此操作。此外,即使我尝试仅用一行读取 6 个文件,代码也会中断。【参考方案2】:

所以问题与性能不佳或卡在 I/O 上无关。该问题与 Jupyter 和 Windows 有关。在 Windows 上,我们需要在初始化池之前包含这样的 if 子句:if __name__ = '__main__':。对于 Jupyter,我们需要将 worker 保存在单独的文件中,并在代码中导入。 Jupyter 也存在问题,因为它默认不提供错误日志。当我在 python shell 上运行代码时,我了解了 windows 问题。当我在 Ipython Shell 上运行代码时,我了解了 Jupyter 错误。以下帖子对我帮助很大。

For Jupyter

For Windows Issue

【讨论】:

以上是关于在 Jupyter Windows 上使用 pool 并行读取多个文件需要很长时间:的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上通过命令行运行 Jupyter

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

如何在 Windows 10 上使用 Powershell 将 Google Colab 与本地 TensorFlow Jupyter 服务器一起使用?

%%time 在 Jupyter 笔记本中的 Windows 上不返回 CPU 时间

windows10 下安装tensorflow 并且在jupyter notebook 上使用tensorflow

Windows10远程访问Ubuntu服务器上的Jupyter Notebook解决办法