Dask:多处理在Mac上有效,但在Windows上不起作用



我的dask多处理代码来应用两个不同的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%,服务器冻结。

Windows处理多处理的方式与Mac和Linux略有不同。

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

  1. 在单独的模块中定义函数
  2. 确保函数不隐式依赖于任何全局变量。 如果您需要一些额外的变量,例如mylist则显式传入(apply方法可以采用其他关键字参数(
  3. 在本地计算机上尝试分布式调度程序。 https://docs.dask.org/en/latest/scheduling.html#dask-distributed-local

相关内容

  • 没有找到相关文章

最新更新