我一直在阅读关于dask以及如何从S3读取数据并以不需要数据完全驻留在RAM中的方式进行处理的方法。
如果我有一个非常大的S3文件,我想了解dask
会做什么。它会:
/tmp
或其他什么内容?我在这里假设我在数据帧上做了很多不同的复杂计算,它可能需要对数据进行多次传递 - 即让我们说连接,分组等等。
另外,一个附带问题是我是否正在从S3进行选择>加入> groupby>过滤器>加入 - 我加入的临时数据帧是否会在S3上?还是在磁盘上?还是RAM?
我知道Spark会在这种情况下使用RAM并溢出到HDFS。
我现在主要考虑单机dask。
答案 0 :(得分:2)
对于许多文件类型,例如CSV,镶木地板,S3上的原始大文件可以安全地拆分成块进行处理。在这种情况下,每个Dask任务将通过单独调用S3一次处理一个数据块。每个块在处理它时都会在工作者的记忆中。
当进行涉及连接来自许多文件块的数据的计算时,块的预处理仍然如上所述,但现在Dask保持临时结构以累积部分结果。内存大小取决于数据的分块大小,您可能控制也可能不控制,具体取决于数据格式,以及您想要应用于哪种计算。
是的,在内存使用量很大的情况下,Dask能够溢出到光盘。这在分布式调度程序中更好地处理(现在即使在单个机器上也是推荐的默认值)。如果使用--memory-limit
/ --local-directory
,请使用Client()
和LocalCluster()
CLI参数或其等效参数来控制每个工作程序可以使用的内存量以及放置临时文件的位置。