我在很多函数中看到参数
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)
npartitions
属性是组成单个 Dask 数据帧的 Pandas 数据帧的数量。这主要通过两种方式影响性能。
通常您需要的分区数是核心数的几倍。每个任务在调度程序中占用几百微秒。
您可以在数据摄取时使用
blocksize=
中的 read_csv(...)
等参数确定分区数量,也可以在之后使用 .repartition(...)
方法确定分区数量。
我尝试检查适合我的情况的最佳数字是多少。 我使用 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 用小数据检查了它)