Python 为什么对于Dask数据帧,compute()方法速度慢,而head()方法速度快?

Python 为什么对于Dask数据帧,compute()方法速度慢,而head()方法速度快?,python,pandas,bigdata,dask,Python,Pandas,Bigdata,Dask,所以我是一个处理大数据的新手。 我正在处理一个60GB的CSV文件,所以我决定尝试一下Dask,因为它会生成数据帧。这可能是一个愚蠢的问题,但请容忍我,我只需要在正确的方向上推动一下 因此,我理解为什么使用“compute”方法的以下查询会很慢(惰性计算): 顺便说一句,计算起来花了10分钟 但我不明白的是,为什么下面使用“head”方法的代码在不到两秒钟的时间内打印输出(即,在本例中,我要求250行,而前面的代码片段仅打印5行): 为什么“头”法不需要很长时间?我觉得我遗漏了一些东西,因为我能

所以我是一个处理大数据的新手。 我正在处理一个60GB的CSV文件,所以我决定尝试一下Dask,因为它会生成数据帧。这可能是一个愚蠢的问题,但请容忍我,我只需要在正确的方向上推动一下

因此,我理解为什么使用“compute”方法的以下查询会很慢(惰性计算):

顺便说一句,计算起来花了10分钟

但我不明白的是,为什么下面使用“head”方法的代码在不到两秒钟的时间内打印输出(即,在本例中,我要求250行,而前面的代码片段仅打印5行):

为什么“头”法不需要很长时间?我觉得我遗漏了一些东西,因为我能够以比使用“计算”方法更短的时间提取大量行。 或者在其他情况下使用计算方法


注意:我试图阅读文档,但没有解释为什么head()很快。

这会处理整个数据集

df.loc[1:5, 'enaging_user_following_count'].compute()

原因是,
loc
是一个基于标签的选择器,不知道哪个分区中存在哪些标签(没有理由它们应该单调递增)。在索引格式良好的情况下,您可能会有有用的df.divisions值,在这种情况下,Dask应该只能选择您需要的数据分区。

我半年前就讨论过这个问题
.head()
不检查所有分区,只检查第一个分区。没有同步开销等,所以它相当快,但它没有考虑到整个数据集

你可以试试

df.loc[-251: , 'enaging_user_following_count'].head(250)
IIRC您应该获得第一个分区的最后250个条目,而不是实际的最后索引

如果你尝试类似的东西

df.loc[conditionThatIsOnlyFulfilledOnPartition3 , 'enaging_user_following_count'].head(250)
您得到的错误是head找不到250个样本


如果您实际上只需要前几个条目,但是速度非常快:)

在我看来,第二个示例最多只处理300行,其中第一个示例处理整个行dataset@juanpa.arrivillaga真正地我做错什么了吗?在第一个示例中,我指定了“1:5”。。。我是如何处理整个数据集的?啊,不,我的眼睛让我失望了。是的,这很奇怪。
df.loc[-251: , 'enaging_user_following_count'].head(250)
df.loc[conditionThatIsOnlyFulfilledOnPartition3 , 'enaging_user_following_count'].head(250)