如何使用Dask来利用所有CPU核心?

19

我有一个超过35000行的pandas系列。我想使用dask使其更高效。然而,我发现无论是dask代码还是pandas代码都需要相同的时间。

最初的"ser"是一个pandas系列,fun1fun2是基本函数,用于在系列的各个行中执行模式匹配。

ser = ser.apply(fun1).apply(fun2)

Dask:

ser = dd.from_pandas(ser, npartitions = 16)
ser = ser.apply(fun1).apply(fun2)

在检查CPU核心状态时,我发现并不是所有的核心都在运行。只有一个核心被用于 100%。

是否有一种方法可以使用Dask使系列代码更快或者利用CPU的所有核心来执行Dask操作?

1个回答

29

请参见http://dask.pydata.org/en/latest/scheduler-overview.html

你正在调用的函数可能是纯Python的,并且会占用GIL(全局解释器锁),它确保在线程中仅有一个Python指令被处理。在这种情况下,您需要在单独的进程中运行您的函数才能看到任何并行性。您可以通过使用多进程调度程序来实现这一点。

ser = ser.apply(fun1).apply(fun2).compute(scheduler='processes')

或者通过使用分布式调度器(在单台计算机上运行良好,并且实际上具有一些下一代优势,例如状态仪表板);在最简单的默认情况下,只需创建客户端即可:

client = dask.distributed.Client()

但你应该阅读文档


仍然只使用了8个核心中的1或2个。奇怪。 - Soren
在调用客户端时,您应该调整工作进程和每个进程的线程数。您希望每个工作进程有1个线程。 - mdurant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接