我正在尝试了解本地计算机上Dask的使用模式。
具体地,
Pandas通过单核执行这些操作,这些操作对我来说需要数小时。我的机器上有8个内核,因此,我希望尽可能使用Dask来并行化这些操作。
我的问题如下:在Dask中这两种方式之间有什么区别:
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
(1)
import dask.dataframe as dd
df = dd.from_pandas(
pd.DataFrame(iris.data, columns=iris.feature_names),
npartitions=2
)
df.mean().compute()
(2)
import dask.dataframe as dd
from distributed import Client
client = Client()
df = client.persist(
dd.from_pandas(
pd.DataFrame(iris.data, columns=iris.feature_names),
npartitions=2
)
)
df.mean().compute()
一种使用模式比另一种使用模式有什么好处?为什么我要用一个而不是另一个?
答案 0 :(得分:2)
与版本(1)相比,版本(2)有两个不同之处:使用分布式调度程序的选择和persist
。这些是独立的因素。有很多关于这两者的文档:https://distributed.readthedocs.io/en/latest/quickstart.html,http://dask.pydata.org/en/latest/dataframe-performance.html#persist-intelligently,所以这个答案可以保持简短。
1)分布式调度程序比以前的线程和多进程调度程序更新,更智能。顾名思义,它可以使用集群,但也可以在一台机器上运行。虽然调用.compute()
时的延迟通常较高,但在许多方面它更有效,具有更高级的功能,如实时动态编程和更多诊断,如仪表板。使用Client()
创建时,默认情况下会获得与内核数相等的进程数,但您可以选择进程数和线程数,并使用{{1}接近原始线程的情况}。
2)持久意味着评估计算并将其存储在内存中,以便进一步计算更快。您也可以在没有分布式客户端(Client(processes=False)
)的情况下保留。它有效地提供了交换内存以提高性能,因为每次将它用于依赖它的任何事情时,您都不需要重新评估计算。如果你继续只对中间体执行一次计算,就像在例子中那样,它对性能没有任何影响。