我如何从一个任务数据框不计算整个数据框拉前五个值?



晚上好!

我有一个类似的代码,我将粘贴在下面,它有更多的数据,但前提是相同的。我必须从两个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秒。

需要记住的一点是,dask中的值实际上是序列化的操作堆栈。大量的计算被延迟,直到你真正要求值具体化的时候——比如使用head,或者通常使用.compute()

根据persist的一般建议,您可以尝试在sort调用之后使用.persist():

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

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

答案是,任务获取前五项的速度相当快。但是,如果它们不在内存中,那么解决所有的计算可能不会那么快。

一般情况下,你应该避免像这个例子中那样对整个数据集进行排序!

最新更新