Python 直接从dask工作进程写入输出

Python 直接从dask工作进程写入输出,python,dask,Python,Dask,我有一个转换数据帧映射的管道。输出较大-输入数据框中的行包含二进制格式的音频,输出数据框中的行包含提取的二进制特征 我从一个分区的拼花地板文件中读取输入,并将其写回另一个拼花地板文件——两者都在网络共享上 据我所知,在分布式dask中,每个工作进程都会将输出发送回调度程序,然后调度程序可能会将其发送回客户端??只有这样,调度器或客户端才会将其写入网络共享。这是正确的吗 如果是,如果数据很大且带宽是一个问题,那么在这种情况下似乎存在冗余通信-在这种情况下,为什么工作人员不能将输出直接发送到最终目标

我有一个转换数据帧映射的管道。输出较大-输入数据框中的行包含二进制格式的音频,输出数据框中的行包含提取的二进制特征

我从一个分区的拼花地板文件中读取输入,并将其写回另一个拼花地板文件——两者都在网络共享上

据我所知,在分布式dask中,每个工作进程都会将输出发送回调度程序,然后调度程序可能会将其发送回客户端??只有这样,调度器或客户端才会将其写入网络共享。这是正确的吗


如果是,如果数据很大且带宽是一个问题,那么在这种情况下似乎存在冗余通信-在这种情况下,为什么工作人员不能将输出直接发送到最终目标网络共享?当然,共享需要对所有工作人员可用,并且有人需要同步写入,但这不是dask的魔力所在吗?

您的理解是错误的:工作人员将直接对共享存储或云/网络服务进行读写,这是正常的计算方式

df = dd.read_parquet(url)
df_out = do_work(df)
df_out.to_parquet(url2)
在这种情况下,调度程序或客户端永远看不到数据。不过,它们确实进行了通信:客户机将加载有关数据集的元数据,以便它可以推断如何分割要完成的工作,调度程序与客户机和工作人员进行对话,以分发这些任务规范,并检查它们何时完成

您可以选择将整个数据集作为一个带有

local_df = df.compute()

但这是可选的,显然不建议在数据大小大于内存的情况下使用。您通常不需要对整个数据集执行此操作,只需要对一些比原始数据集小得多的聚合结果执行此操作。即使在这种情况下,调度程序本身也不会存储结果。

谢谢@mdurant!这是我所期望的,但找不到明确的文档来说明这一点。此外,dask如何决定工人是否可以直接写?i、 如果我保存到一个本地文件,文件会在哪里?如果你提供了一个本地路径,工件将在工人的文件系统中。您需要写入共享网络资源或云存储—这也是获得并行带宽的方式。