2017-10-13 6 views
1

私は、ハイブフォーマットとスナッピー圧縮のパーケットファイルを用意しています。それはメモリに収まり、pandas.infoは以下のデータを提供します。分散型ファーストディスパッチの処理時間が一貫していません

寄木細工のファイルのグループごとの行数が今

>>> df.info() 
<class 'pandas.core.frame.DataFrame'> 
Index: 21547746 entries, YyO+tlZtAXYXoZhNr3Vg3+dfVQvrBVGO8j1mfqe4ZHc= to oE4y2wK5E7OR8zyrCHeW02uTeI6wTwT4QTApEVBNEdM= 
Data columns (total 8 columns): 
payment_method_id   int16 
payment_plan_days   int16 
plan_list_price   int16 
actual_amount_paid  int16 
is_auto_renew    bool 
transaction_date   datetime64[ns] 
membership_expire_date datetime64[ns] 
is_cancel     bool 
dtypes: bool(2), datetime64[ns](2), int16(4) 
memory usage: 698.7+ MB 

ちょうど100K

で、DASKでいくつかの簡単な計算をする私は、分散を使用して

>>>time.asctime();ddf.actual_amount_paid.mean().compute();time.asctime() 
'Fri Oct 13 23:44:50 2017' 
141.98732048354384 
'Fri Oct 13 23:44:59 2017' 

スレッディング使用して、次のタイミング

を取得(ローカルクラスタ)

>>> c=Client() 
>>> time.asctime();ddf.actual_amount_paid.mean().compute();time.asctime() 
'Fri Oct 13 23:47:04 2017' 
141.98732048354384 
'Fri Oct 13 23:47:15 2017' 
>>> 

それはそれぞれ約9秒でOKでした。今、マルチプロセッシングを使用して

が、ここでは驚きが付属しています...

>>> time.asctime();ddf.actual_amount_paid.mean().compute(get=dask.multiprocessing.get);time.asctime() 
'Fri Oct 13 23:50:43 2017' 
141.98732048354384 
'Fri Oct 13 23:57:49 2017' 
>>> 

私は、マルチプロセッシングと分散/ローカルクラスタは、スレッドと、おそらくいくつかの相違点と同じオーダーであることを期待する(良いか悪いかについて)

しかし、マルチプロセッシングでは、in16列全体で単純な平均をとるのに47倍も時間がかかりますか?

私のenvは、必要なモジュールをインストールしたばかりの新しいコンドミニアムです。何も手作りではありません。

なぜこの違いがありますか?私はdask/distributedを管理して、問題の性質に応じて異なるスケジューラーの間で賢明に選択できるように、予測可能な振る舞いを持つことはできません。

これは単なるおもちゃの例ですが、私は私の期待に合った例を得ることができませんでした。

私の心の後ろに守っておくべきことがありますか?または私はちょうどポイントを完全に逃していますか?この場合のデータのすべて - - ねじ切りスケジューラで

おかげ

JC

答えて

1

は、各タスクは、プロセスのすべてのメモリへのアクセスを持っているため、任意のメモリコピーせずにその計算を行うことができます。

分散スケジューラでは、スケジューラは、どのスレッドおよびどのワーカーが後続のタスクで必要なデータを生成しているのか、またはそのデータをすでにメモリに保持しているかどうかを認識します。スケジューラの巧みさは、特にデータ通信とコピーを避けるために、正しい作業者に計算を移動させることに向けられています。

逆に、マルチプロセススケジューラは、メインプロセスとの間でタスク結果を送信する傾向があります。これには、多くのシリアライズとコピーが必要です。いくつかのタスクは融合することができます(チェーン内で多くのPython関数を呼び出すことによってタスクを結合します)が、いくつかのタスクは融合できません。シリアライゼーションやコピーにはCPUの労力がかかりますが、おそらくもっと重要なのはメモリスペースです。元のデータがシステム合計のかなりの部分である場合は、おそらく物理メモリがいっぱいになっているため、大きな要因が減速します。

+0

はい、私は実際に同じ結論に達したいくつかのレスリングとマニュアルの再読み込みの後に。たくさんの学習;-) –

関連する問題