Daskのドキュメントでは、オーバーヘッドを削減するための再分割について説明しています ここ 。
ただし、データフレームがどのように見えるかについて、ある程度の知識が必要であることを示しているようです(つまり、データの1/100が予想されます)。
想定せずに賢明にパーティションを分割する良い方法はありますか?現時点では、npartitions = ncores * magic_number
、必要に応じて強制的にTrue
に設定してパーティションを拡張します。この1つのサイズはすべてのアプローチに適合しますが、データセットのサイズが異なるため、明らかに最適ではありません。
データは時系列データですが、残念ながら定期的な間隔ではありません。過去の時間の頻度による再パーティション化を使用しましたが、データが非常に不規則であるため、これは最適ではない場合があります(場合によっては数分から数千秒)。
Mrocklinとの議論の後、パーティショニングの適切な戦略は、df.memory_usage().sum().compute()
によって導かれる100MBのパーティションサイズを目指すことです。 RAMに収まるデータセットを使用すると、これに関連する可能性のある追加の作業を、関連するポイントに配置されたdf.persist()
を使用して軽減できます。
サマンサヒューズの答えに追加するだけです:
memory_usage()
は、デフォルトでは、オブジェクトのdtype列のメモリ消費を無視します。私が最近使用しているデータセットの場合、これは約10倍のメモリ使用量の過小評価につながります。
オブジェクトのdtype列がないことが確実でない限り、_deep=True
_を指定することをお勧めします。
df.repartition(npartitions= 1+df.memory_usage(deep=True).sum().compute() // n )
ここで、n
は、ターゲットパーティションのサイズ(バイト単位)です。 1を追加すると、パーティションの数が常に1より大きくなります(_//
_はフロア除算を実行します)。