本地使用dask:到Client()还是不到Client()?

时间:2018-05-30 23:44:49

标签: python data-science dask dask-distributed

我正在尝试了解本地计算机上Dask的使用模式。

具体地,

  • 我有一个适合内存的数据集
  • 我想做一些大熊猫的操作
    • GROUPBY ...
    • 日期解析

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()

一种使用模式比另一种使用模式有什么好处?为什么我要用一个而不是另一个?

1 个答案:

答案 0 :(得分:2)

与版本(1)相比,版本(2)有两个不同之处:使用分布式调度程序的选择和persist。这些是独立的因素。有很多关于这两者的文档:https://distributed.readthedocs.io/en/latest/quickstart.htmlhttp://dask.pydata.org/en/latest/dataframe-performance.html#persist-intelligently,所以这个答案可以保持简短。

1)分布式调度程序比以前的线程和多进程调度程序更新,更智能。顾名思义,它可以使用集群,但也可以在一台机器上运行。虽然调用.compute()时的延迟通常较高,但在许多方面它更有效,具有更高级的功能,如实时动态编程和更多诊断,如仪表板。使用Client()创建时,默认情况下会获得与内核数相等的进程数,但您可以选择进程数和线程数,并使用{{1}接近原始线程的情况}。

2)持久意味着评估计算并将其存储在内存中,以便进一步计算更快。您也可以在没有分布式客户端(Client(processes=False))的情况下保留。它有效地提供了交换内存以提高性能,因为每次将它用于依赖它的任何事情时,您都不需要重新评估计算。如果你继续只对中间体执行一次计算,就像在例子中那样,它对性能没有任何影响。