每个工作人员的DASK内存指南

时间:2019-09-20 15:21:00

标签: python dask dask-distributed

我目前正在将一些遗留分析重构为Python / DASK,以显示其作为解决方案的有效性。

我正试图建立一个演示场景,内存有问题,并希望获得一些建议。

我的情况;我将数据拆分为S3上的52个gzip压缩木地板文件,每个文件在内存中未压缩的大小约为100MB,数据集的总大小约为5.5GB,正好是100,000,000行。

我的调度程序在T2.Medium(4GB / 2vCPU)上,我的4个工作程序也在。 每个工作程序都以1个进程,1个线程和4GB的内存限制运行,即dask-worker MYADDRESS --nprocs 1 --nthreads=1 --memory-limit=4GB

现在,我要提取实木复合地板文件并立即在一个列上重新分区,以使我最终得到大约480个分区,每个分区约11MB。

然后,我正在使用map_partitions进行主体工作。 这对于小型数据集来说效果很好,但是对于1亿数据集,我的工作人员由于没有足够的内存而不断崩溃。 我在这里做错了什么? 对于特定于实现的信息,由于本质上是分区数据帧上的交叉联接,我传递给map_partitions的函数有时可能需要大约1GB。

我不了解DASK的体系结构吗?在我的调度程序和我的4个工作人员之间,有20GB的内存可以使用,但是事实证明这还不够。 从我从DASK文档中了解到的是,只要每个分区以及对该分区所做的工作都适合工作人员的内存,那么您就可以了吗?

4GB是否还不够?是否需要更多方式来处理调度程序/进程间通信头?

感谢阅读。

1 个答案:

答案 0 :(得分:0)

请参见https://docs.dask.org/en/latest/best-practices.html#avoid-very-large-partitions

为了方便起见,我将在此处复制文本

您的数据块应该足够小,以便其中的许多数据可以立即放入工作人员的可用内存中。在Dask DataFrame中选择分区大小或在Dask Array中选择块大小时,通常可以控制此操作。

Dask可能会在一台计算机上并行操作尽可能多的块,就像该计算机上具有内核一样。因此,如果您有1 GB的块和10个内核,则Dask可能会使用至少10 GB的内存。此外,Dask通常有2-3倍的可用块进行处理,因此总是有需要处理的东西。

如果您有一台具有100 GB和10个内核的计算机,那么您可能希望选择1GB范围内的块。您每个内核有10个块的空间,这可以使Dask拥有一个健康的利润空间,而不必执行太小的任务