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

Jon*_*han 7 python dask data-science dask-distributed

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

具体来说,

  • 我有一个适合内存的数据集
  • 我想做一些熊猫操作
    • 通过...分组...
    • 日期解析
    • ETC。

Pandas 通过单个核心执行这些操作,这些操作对我来说需要几个小时。我的机器上有 8 个核心,因此,我想使用 Dask 尽可能地并行化这些操作。

我的问题如下: Dask 中执行此操作的两种方式有什么区别:

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
Run Code Online (Sandbox Code Playgroud)

(1)

import dask.dataframe as dd

df = dd.from_pandas(
    pd.DataFrame(iris.data, columns=iris.feature_names),
    npartitions=2
)

df.mean().compute()
Run Code Online (Sandbox Code Playgroud)

(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()
Run Code Online (Sandbox Code Playgroud)

一种使用模式相对于另一种使用模式有什么好处?为什么我应该使用其中一种而不是另一种?

mdu*_*ant 5

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

1)分布式调度器比以前的线程和多进程调度器更新、更智能。顾名思义,它既可以使用集群,也可以在单机上工作。尽管调用时的延迟.compute()通常较高,但在许多方面它更高效,具有更高级的功能(例如实时动态编程)和更多诊断(例如仪表板)。使用 创建时Client(),默认情况下会获得等于核心数量的进程数,但您可以选择进程和线程的数量,并接近原始的仅线程情况Client(processes=False)

2)持久化意味着评估计算并将其存储在内存中,以便进一步的计算更快。您也可以在没有分布式客户端 ( dask.persist) 的情况下进行持久化。它有效地提供了以内存换取性能的方案,因为每次将其用于依赖于它的任何内容时,您无需重新评估计算。如果您继续对中间体仅执行一次计算(如示例中所示),那么它应该不会对性能产生影响。