2017-10-18 54 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