2017-06-08 17 views
1

Daskでループを実装する際に問題が発生しています。 は、例えば、次のコードで:DASKループ内のデータフレーム

for i in range(len(col)): 
    if df[col[i]].dtype=='object': 
     pass 
    elif df[col[i]].std().compute()==0: 
     cols_constant.append(col[i]) 
df = df.drop(cols_constant,axis=1) 

同じコードは、パンダを使用して非常に高速ですが、DASKにタスクを完了するために、かなりの時間を取っています。

私はDaskがループ上では効率が悪いと理解しています。 しかし、上記のような関数のDaskのコードを最適化するにはどうすればよいですか?

複数のワーカーシステムで計算を行う予定であるため、e.persist()を使用することはできません。

同じタスクを並列化するために 'dask.do'関数を使用すると便利でしょうか?

答えて

2

df.column.std.compute()に電話するたびにstd()を呼び出す費用と、dfを作成する費用が発生します。あなたがパンダのデータフレームからdfを作成した場合、これは安いですが、CSVファイルから読み込むような、より高価なプロセスからdfを作成した場合、非常に高価になる可能性があります。あなたはメモリを持っている場合は

df = dd.from_pandas() # ok to call compute many times, data is already in memory 
df = dd.read_csv(...) # slow to call compute many times, we read the all the csv files every time you call compute 

その後、あなたはあなたがマルチでこれを行うことを計画ので、あなたが使用して存続できないと言うあなたの質問に

df = df.persist() 

を持続呼び出すことによって、この繰り返しのコストを回避することができますワーカーシステム。使用可能なメモリがある場合は、単一の作業者と複数の作業者のすべての場合に、persistが機能します。

また、computeを1回呼び出すだけで、繰り返し呼び出すことを避けることもできます。

stds = [df[column].std() for column in df.columns] 
stds = dask.compute(stds) 

これは、単一のパス内のすべてを計算し

関連する問題