代码之家  ›  专栏  ›  技术社区  ›  Martin Thoma

nPartition在Dask数据帧中的作用是什么?

  •  16
  • Martin Thoma  · 技术社区  · 9 年前

    npartitions 在许多功能中,但我不理解它的用途。

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

    头部(…)

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

    重新分区(…)

    输出的分区数必须小于输入的分区数。仅当未指定分割时使用。

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

    2 回复  |  直到 6 年前
        1
  •  29
  •   MRocklin    9 年前

    这个 npartitions 属性是组成单个Dask数据帧的数据帧数。这主要从两个方面影响性能。

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

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

    您可以在数据接收时使用以下参数确定分区的数量: blocksize= read_csv(...) 或之后使用 .repartition(...)

        2
  •  1
  •   rafine    4 年前

    我试着检查我的案例的最佳数字是多少。 我在8核的笔记本电脑上工作。 我在1,5,301000个分区上运行函数“descripe”

    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分钟

    11000>大约9分钟

    但是我发现,当我使用多个分区时,像中值或百分位这样的“顺序”函数给出了错误的数字。

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