Dask:多重处理在Mac上有效,但在Windows上无效

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

我要应用两个不同的lambda应用函数的快捷多处理代码在Mac上运行完美,但无法在Windows 7服务器上运行。我可以在Windows 7上使用线程运行代码,但是速度非常慢。当我在Windows 7服务器上尝试调度程序进程时,所有核心上的CPU使用率均达到100%,并且服务器冻结。

我可以使用scheduler = 'threads'或通过指定num_workers在Windows中运行以下代码,但似乎并没有使用所有内核。在Mac上使用num_workers或线程,它比scheduler='multiprocessing'慢得多。

Windows是否需要一些其他代码来使内核/工作人员不过载?

import pandas as pd
import dask.dataframe as ddf
import multiprocessing

daskdf = ddf.from_pandas(mypandasdataframe, npartitions=4*multiprocessing.cpu_count())


def removecw(df):
    for word in mylist:
        df['A'] = df['A'].apply(lambda x: re.sub(r'\b{}$'.format(re.escape(word)), '', x))
    return df


daskdf = daskdf.map_partitions(removecw, meta = daskdf)
daskdf = daskdf.compute(scheduler='processes')

daskdf.to_csv('outputfilename')

在Mac上,我可以运行具有预期结果的代码(从A列的字符串末尾删除常用单词)。当我在Windows 7服务器上尝试调度程序进程时,所有核心上的CPU使用率均达到100%,并且服务器冻结。

python windows multiprocessing scheduler dask
1个回答
0
投票

Windows处理多处理与Mac和Linux有所不同。

我的猜测是,您的问题是由于尝试传递难以序列化的功能引起的。也许它隐式依赖于未传入的变量,或者它是动态定义的。您可以尝试以下方法,但不能保证:

  1. 在单独的模块中定义功能
  2. 请确保您的函数不隐式依赖任何全局变量。如果您需要一些其他变量,例如mylist,则将其显式传递(apply方法可以使用其他关键字参数)
  3. 尝试在本地计算机上使用分布式调度程序。 https://docs.dask.org/en/latest/scheduling.html#dask-distributed-local
© www.soinside.com 2019 - 2024. All rights reserved.