索引后 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 关键字,如果你碰巧有信息 - 这不需要排序,并相应地更快。
无法重现,但有人可以解释为什么 .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 关键字,如果你碰巧有信息 - 这不需要排序,并相应地更快。