Sam*_*hes 13 python optimization dataframe dask
对于DASK文档有关重新分割,以减少开销谈到这里.
然而,它们似乎表明您需要预先知道数据帧的外观(即预期数据的1/100).
是否有一种很好的方法可以在不做假设的情况下明智地进行重新分配?目前我只是重新分配npartitions = ncores * magic_number,并设置强制True扩展分区,如果需要.这种尺寸适用于所有方法,但由于我的数据集大小不同,因此绝对不是最理想的.
数据是时间序列数据,但不幸的是不是定期的,我过去曾经按时间频率重新分配,但由于数据的不规则性(这有时几分钟没有数千秒),这将是次优的.
小智 23
从Dask 2.0.0 开始,您可以调用.repartition(partition_size="100MB").
此方法执行.memory_usage(deep=True)分区大小的考虑对象 ( ) 细分。它将加入较小的分区,或已经变得太大的拆分分区。
Dask 的文档还概述了用法。
只是为了补充萨曼莎·休斯的答案:
memory_usage()默认情况下,忽略对象dtype列的内存消耗。对于我最近使用的数据集,这导致低估了大约10倍的内存使用量。
除非您确定没有对象dtype列,否则我建议您指定deep=True,即使用以下方法重新分区:
df.repartition(npartitions= 1+df.memory_usage(deep=True).sum().compute() // n )
n目标分区大小在哪里(以字节为单位)。加1可确保分区数始终大于1(//执行楼层划分)。
与mrocklin讨论后,一个不错的分区策略是瞄准磁盘大小为100MB的分区df.memory_usage().sum().compute()。利用适合RAM的数据集,可以通过df.persist()将它们放置在相关点上来减轻可能涉及的其他工作。