我目前正在致力于将一些遗留分析重构到Python/DASK中,以展示其作为未来解决方案的有效性。
我正在尝试设置一个演示场景,我遇到了内存问题,希望得到一些建议。
我的场景是:我在S3上将数据拆分为52个gzip压缩的拼图文件,每个文件在内存中的未压缩大小约为100MB,总数据集大小约为5.5 52,行大小正好为100,000,000行。
我的调度器在T2中(4 4GB/2vCPU),我的4个工作进程也是如此。每个worker运行一个进程,一个线程和4 4GB的内存限制,即dask-worker MYADDRESS --nprocs 1 --nthreads=1 --memory-limit=4GB
。
现在,我正在提取拼图文件,并立即对一个列进行重新分区,最终得到大约480个分区,每个分区大约11Mb。
然后,我将使用map_partitions来完成主要工作。这对于小的数据集很有效,但是对于100mil的数据集,我的工作人员由于没有足够的内存而不断崩溃。我在这里做错了什么?对于特定于实现的信息,由于分区数据帧上的交叉连接,我传递给map_partitions的函数有时可能需要大约1 1GB。
我是不是不理解与DASK的架构有关的事情?在我的调度器和我的4个工作进程之间,有20 be的内存可以使用,但事实证明这是不够的。从我从DASK文档中读到的内容是,只要每个分区,以及您对该分区所做的操作,都适合worker的内存,那么您应该是可以的?
4 4GB是不是还不够?它是否需要更多的方法来处理调度器/进程间通信开销?
感谢您的阅读。
发布于 2019-09-21 08:28:53
请参阅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个内核,那么您可能希望选择1 GB范围内的块。每个核心有10个块的空间,这为Dask提供了一个健康的空间,而不会有太小的任务
https://stackoverflow.com/questions/58031168
复制相似问题