我一直在阅读有关 dask 的内容以及它如何从 S3 读取数据并以不需要数据完全驻留在 RAM 中的方式进行处理。
我想了解如果我想要读取一个非常大的 S3 文件,dask
会做什么。会吗:
- 将该 S3 文件加载到 RAM 中吗?
- 加载该 S3 文件并将其缓存在
/tmp
或其他位置? - 分批多次调用 S3 文件
我假设在这里我正在对数据帧进行许多不同的复杂计算,并且可能需要对数据进行多次传递 - 即,假设连接、分组等。
另外,一个附带问题是,如果我从 S3 > join > groupby > filter > join 中进行选择 - 我要加入的临时数据帧会在 S3 上吗?或者在磁盘上?还是内存?
我知道 Spark 在这种情况下使用 RAM 并溢出到 HDFS。
目前我主要考虑的是单机dask。
最佳答案
对于许多文件类型,例如 CSV、parquet,S3 上的原始大文件可以安全地分割成 block 进行处理。在这种情况下,每个 Dask 任务将通过单独调用 S3 一次处理一大块数据。每个 block 在处理时都将位于工作进程的内存中。
当进行涉及连接来自多个文件 block 的数据的计算时, block 的预处理仍然按照上面的方式进行,但现在 Dask 保留临时结构来累积部分结果。多少内存取决于数据的分块大小,您可能会也可能不会控制数据的分块大小,具体取决于数据格式以及您想要对其应用的计算。
是的,当内存使用量很大时,Dask 能够溢出到光盘上。这在分布式调度程序中可以得到更好的处理(现在即使在单台机器上也是推荐的默认调度程序)。使用 --memory-limit
和 --local-directory
CLI 参数,或者使用 Client()
/ 时的等效参数LocalCluster()
,控制每个工作线程可以使用多少内存以及放置临时文件的位置。
关于amazon-web-services - dask S3读取缓存磁盘/RAM上的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49727213/