是否需要在LocalCluster内部或外部进行计算(例如dask方法dd.merge)?是否需要在LocalCluster内部或外部进行最终计算(例如.compute)?
我的主要问题是-LocalCluster()如何影响任务数量?
我和我的同事注意到,将dd.merge放置在LocalCLuster()之外大大降低了任务数量(例如10x或诸如此类)。是什么原因呢?
伪示例
许多任务:
dd.read_parquet(somewhere, index=False)
with LocalCluster(
n_workers=8,
processes=True,
threads_per_worker=1,
memory_limit="10GB",
ip="tcp://localhost:9895",
) as cluster, Client(cluster) as client:
dd.merge(smth)
smth..to_parquet(
somewhere, engine="fastparquet", compression="snappy"
)
少量任务:
dd.read_parquet(somewhere, index=False)
dd.merge(smth)
with LocalCluster(
n_workers=8,
processes=True,
threads_per_worker=1,
memory_limit="10GB",
ip="tcp://localhost:9895",
) as cluster, Client(cluster) as client:
smth..to_parquet(
somewhere, engine="fastparquet", compression="snappy"
)
答案 0 :(得分:0)
性能差异是由于所使用的调度程序不同所致。
根据docs,
每个dask集合都有一个默认的调度程序
dask.dataframe默认使用线程调度程序
默认调度程序是未注册其他调度程序时使用的调度程序。
此外,根据分发的docs,
当我们创建一个Client对象时,它会将自己注册为默认的Dask调度程序。所有.compute()方法将自动使用分布式系统启动。
因此,当在集群的上下文管理器中操作时,计算将隐式使用该调度程序。
一些附加说明: 可能是默认调度程序使用的线程多于您定义的本地集群的情况。性能上的显着差异还可能归因于线程调度程序未引起的进程间通信的开销。 here提供了有关调度程序的更多信息。