npartitions 在 Dask 数据框中的作用是什么?

问题描述 投票:0回答:2

我在很多函数中看到参数

npartitions
,但我不明白它有什么用处。

http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.read_csv

头(...)

仅从前 n 个分区中获取元素,默认值为 1。如果第一个 n 分区中的行数少于 n 行,则会引发警告并返回任何找到的行。传递 -1 以使用所有分区。

重新分区(...)

输出的分区数,必须小于输入的npartitions。仅在未指定分区时使用。

在这种情况下分区的数量可能是 5:

(图片来源:http://dask.pydata.org/en/latest/dataframe-overview.html

python dataframe dask
2个回答
36
投票

npartitions
属性是组成单个 Dask 数据帧的 Pandas 数据帧的数量。这主要通过两种方式影响性能。

  1. 如果您没有足够的分区,那么您可能无法有效地使用所有核心。例如,如果您的 dask.dataframe 只有一个分区,那么一次只能有一个核心运行。
  2. 如果分区太多,那么调度程序可能会在决定在哪里计算每个任务时产生大量开销。

通常您需要的分区数是核心数的几倍。每个任务在调度程序中占用几百微秒。

您可以在数据摄取时使用

blocksize=
中的
read_csv(...)
等参数确定分区数量,也可以在之后使用
.repartition(...)
方法确定分区数量。


1
投票

我尝试检查适合我的情况的最佳数字是多少。 我使用 8 核笔记本电脑。 我有 100Gb 的 csv 文件,包含 250M 行和 25 列。 我在 1,5,30,100 个分区上运行“描述”功能

df = df.repartition(npartitions=1)
a1=df['age'].describe().compute()
df = df.repartition(npartitions=5)
a2=df['age'].describe().compute()
df = df.repartition(npartitions=30)
a3=df['age'].describe().compute()
df = df.repartition(npartitions=100)
a4=df['age'].describe().compute()

关于速度:

5,30 > 约3分钟

1, 100 > 约9分钟

但是...我发现当我使用多个分区时,中位数或百分位数等“顺序”函数会给出错误的数字。

1 个分区给出正确的数字(我使用 pandas 和 dask 用小数据检查了它)

© www.soinside.com 2019 - 2024. All rights reserved.