如何解决LocalCluster如何影响任务数量?
是否需要在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,Client(cluster) as client:
smth..to_parquet(
somewhere,compression="snappy"
)
解决方法
性能差异是由于所使用的调度程序不同所致。
根据docs,
每个dask集合都有一个默认的调度程序
dask.dataframe默认使用线程调度程序
默认调度程序是未注册其他调度程序时使用的调度程序。
此外,根据分发的docs,
当我们创建一个Client对象时,它会将自己注册为默认的Dask调度程序。所有.compute()方法将自动使用分布式系统启动。
因此,当在集群的上下文管理器中操作时,计算将隐式使用该调度程序。
一些附加说明: 可能是默认调度程序使用的线程多于您定义的本地集群的情况。性能上的显着差异还可能归因于线程调度程序未引起的进程间通信的开销。 here提供了有关调度程序的更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。