【问题标题】:How can I pull the first five values from a Dask DataFrame without computing the whole DataFrame?如何在不计算整个 DataFrame 的情况下从 Dask DataFrame 中提取前五个值?
【发布时间】:2021-12-14 00:51:41
【问题描述】:

晚上好!

我有一个类似于我将在下面粘贴的代码,它有更多的数据,但前提是相同的。我必须从两个 DataFrame 中提取前五个值,但是当我处理数以千万计的条目时,有时我无法等待长达一个小时来计算整个 DataFrame 并返回前五个值。我也不能使用简单的 Pandas DataFrame,因为它们超出了我的内存限制。有解决办法吗?

import random
import pandas
import dask.dataframe as dd
import time

# Random list from 1 to 10,000,000.
random_pool = [random.randint(1, 1000000) for i in range(10000000)]
random.shuffle(random_pool)

df1 = dd.from_pandas(pandas.DataFrame(random_pool[:100000], columns=["ID"]), npartitions=10)
df2 = dd.from_pandas(pandas.DataFrame(random_pool, columns=["ID"]), npartitions=10)

# Sorting both dataframes.
df1 = df1.sort_values("ID", ascending=True)
df2 = df2.sort_values("ID", ascending=True)

df1_start = time.time()
df1.head(5)
print("DF1 took {:.2f}.".format(time.time() - df1_start))

df2_start = time.time()
df2.head(5)
print("DF2 took {:.2f}.".format(time.time() - df2_start))

第一个 DataFrame 大约需要 0.41 秒,而第二个 DataFrame 大约需要 1.79 秒。

【问题讨论】:

    标签: python pandas data-science dask


    【解决方案1】:

    要记住的一点是,dask 中的值实际上是一系列操作的堆栈。大量计算被推迟到您实际要求实现值时 - 比如使用 head,或者一般来说,使用 .compute()

    本着general advice on persist的精神,您可以尝试在排序调用后使用.persist():

    通常最理想的做法是加载、过滤和混洗一次数据并将结果保存在内存中。之后,几个复杂查询中的每一个都可以基于此内存中的数据,而不必每次都重复完整的 load-filter-shuffle 过程。为此,请使用 client.persist 方法 [在这种情况下为 .persist() 方法]。

    花点时间想想如果我们不在这里坚持下去会发生什么 - 当您致电 head 时需要解决的未来将包括 sort_values 电话,您可能会看到成本每次调用 head 时都会对所有数据进行排序——这就解释了为什么只获取前五个项目的成本与整个数据集的大小成正比——因为正在对整个数据集进行排序。

    答案是 dask 获得前五项的速度相当快。但是,如果它们还没有在内存中,那么解决所有计算以到达那里可能不会那么快。

    一般情况下,您应该avoid whole-dataset shuffling 喜欢这个例子 - 排序!

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 2019-06-18
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2019-09-04
      相关资源
      最近更新 更多