索引后 Dask DataFrame .head() 非常慢

Dask DataFrame .head() very slow after indexing

无法重现,但有人可以解释为什么 .head() 调用在索引后速度大大降低吗?

import dask.dataframe as dd
df = dd.read_parquet("Filepath")
df.head() # takes 10 seconds

df = df.set_index('id')

df.head() # takes 10 minutes +

docs 中所述,set_index 根据新索引对数据进行排序,这样沿着该索引的划分将数据拆分到其逻辑分区中。排序是需要额外时间的事情,但一旦执行,将使对该索引的操作更快。 head() 原始文件将从磁盘上的第一个数据块中获取而不考虑任何顺序。

您可以使用 index= 关键字到 read_parquet(也许数据本来就已经排序了?)或使用 .map_partitions(lambda df: df.set_index(..)) 来设置索引而不用这种排序,但这提出了一个明显的问题,你为什么要打扰,你想达到什么目的? 如果 数据已经排序,那么你也可以使用 set_index(.., sorted=True) 甚至 divisions 关键字,如果你碰巧有信息 - 这不需要排序,并相应地更快。