晚上好!
我有一個類似于我將在下面粘貼的代碼,它有更多的資料,但前提是相同的。我必須從兩個 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 秒,而第二個大約需要 1.79 秒。
uj5u.com熱心網友回復:
要記住的一件事是 dask 中的值實際上是一個序列化的操作堆疊。大量計算被推遲到您實際要求將值具體化時 - 比如使用 head,或者一般來說,使用.compute().
本著關于 的一般建議persist的精神,您可以嘗試在 sort 呼叫后使用 .persist() :
將資料加載、過濾和混洗一次并將結果保存在記憶體中通常是理想的做法。之后,多個復雜查詢中的每一個都可以基于此記憶體資料,而不必每次都重復完整的加載過濾器洗牌程序。為此,請使用 client.persist 方法 [本例中的 .persist() 方法]。
花點時間想想如果我們不堅持下去會發生什么——你打電話時需要解決的未來head將包括sort_values電話,你可能會看到每次打電話時對所有資料進行排序的成本head——這就解釋了為什么只獲取前五個專案的成本與整個資料集的大小成正比——因為整個資料集都被排序了。
答案是 dask 獲得前五個專案的速度非常快。但是,如果它們還沒有在記憶體中,那么解決所有計算以到達那里可能不會那么快。
通常,您應該避免像本示例中那樣對整個資料集進行改組- 排序!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340424.html
上一篇:第一次迭代后回圈停止
