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

时间:2018-07-29 20:53:30

标签: dask

不可复制,但是有人可以填写为什么索引后.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 +

1 个答案:

答案 0 :(得分:2)

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

您可以设置索引而无需使用index=关键字为read_parquet(也许数据已经固有地排序了吗?)或使用.map_partitions(lambda df: df.set_index(..))来进行索引设置,但这引起了显而易见的问题,您为什么要打扰,您要达到什么目标? 如果已经对数据进行了排序,那么您也可以使用set_index(.., sorted=True)甚至divides关键字,如果您碰巧拥有该信息,则不需要排序,因此可以进行相应的排序更快。