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

2024-06-28 20:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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

df.loc[50:300 , 'enaging_user_following_count'].head(250)

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

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


Tags: 文件csv数据方法代码dfcount时间
2条回答

这将处理整个数据集

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个样本

如果您实际上只想要前几个条目,那么它非常快:)

相关问题 更多 >