web-dev-qa-db-ja.com

daskデータフレームを効率的に分割するための戦略

Daskのドキュメントでは、オーバーヘッドを削減するための再分割について説明しています ここ

ただし、データフレームがどのように見えるかについて、ある程度の知識が必要であることを示しているようです(つまり、データの1/100が予想されます)。

想定せずに賢明にパーティションを分割する良い方法はありますか?現時点では、npartitions = ncores * magic_number、必要に応じて強制的にTrueに設定してパーティションを拡張します。この1つのサイズはすべてのアプローチに適合しますが、データセットのサイズが異なるため、明らかに最適ではありません。

データは時系列データですが、残念ながら定期的な間隔ではありません。過去の時間の頻度による再パーティション化を使用しましたが、データが非常に不規則であるため、これは最適ではない場合があります(場合によっては数分から数千秒)。

15
Samantha Hughes

Mrocklinとの議論の後、パーティショニングの適切な戦略は、df.memory_usage().sum().compute()によって導かれる100MBのパーティションサイズを目指すことです。 RAMに収まるデータセットを使用すると、これに関連する可能性のある追加の作業を、関連するポイントに配置されたdf.persist()を使用して軽減できます。

5
Samantha Hughes

サマンサヒューズの答えに追加するだけです:

memory_usage()は、デフォルトでは、オブジェクトのdtype列のメモリ消費を無視します。私が最近使用しているデータセットの場合、これは約10倍のメモリ使用量の過小評価につながります。

オブジェクトのdtype列がないことが確実でない限り、_deep=True_を指定することをお勧めします。

df.repartition(npartitions= 1+df.memory_usage(deep=True).sum().compute() // n )

ここで、nは、ターゲットパーティションのサイズ(バイト単位)です。 1を追加すると、パーティションの数が常に1より大きくなります(_//_はフロア除算を実行します)。

5
BHC