本地使用 dask:到 Client() 还是不到 Client()?
Local use of dask: to Client() or not to Client()?
我正在尝试了解 Dask 在本地机器上的使用模式。
具体来说,
- 我有一个适合内存的数据集
- 我想做一些pandas操作
- 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()
一种使用模式相对于另一种使用模式有何优势?为什么我应该使用一个而不是另一个?
版本 (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
)。它有效地提供了以内存换取性能的交易,因为您不需要每次将它用于任何依赖于它的计算时都重新评估计算。如果您继续在中间体上仅执行一次计算,如示例中所示,它对性能应该没有影响。
我正在尝试了解 Dask 在本地机器上的使用模式。
具体来说,
- 我有一个适合内存的数据集
- 我想做一些pandas操作
- 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()
一种使用模式相对于另一种使用模式有何优势?为什么我应该使用一个而不是另一个?
版本 (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
)。它有效地提供了以内存换取性能的交易,因为您不需要每次将它用于任何依赖于它的计算时都重新评估计算。如果您继续在中间体上仅执行一次计算,如示例中所示,它对性能应该没有影响。