2017-10-18 92 views
1

這是一個DASK數據幀的負荷子集的內存的有效方法:子集DASK DataFrames

while i < len_df: 
    j = i + batch_size 
    if j > len_df: 
     j = len_df 
    subset = df.loc[i:j,'source_country_codes'].compute() 

我讀的地方,這可能不是因爲DASK如何分配,因爲這將在更大的索引號是正確的數據幀轉換成更小的熊貓dfs。另外我不認爲dask數據框具有iloc屬性。 我正在使用的版本是0.15.2

就用例而言,這將是一種將批量數據加載到深度學習(如keras)的方式。

回答

1

如果你的數據集有衆所周知的分區,那麼這可能會奏效,但我建議每次只計算一個分區。

for part in df.to_delayed(): 
    subset = part.compute() 

您可以通過預先重新分區

for part in df.repartition(npartitions=100).to_delayed(): 
    subset = part.compute() 

這是不完全一樣的大致控制大小,因爲它並不能保證在每個分區行的固定數量,但可能保證取決於數據的獲得方式,費用相當昂貴。

+0

但後一種方法將保證我將貫穿整個數據集嗎?我還應該提到我之前做過這樣的事情:'df = dd.from_pandas(df,16)'。它會導致衝突還是隻做另一個分區? –

+1

是的,這將包括整個數據集。您可以安全地重新分配。或者,您可以使用不同數量的分區來調用from_pandas。無論哪種方式,一切都應該很好。 – MRocklin