使用共享内存使内存中的任务并行化(不发送给其他进程)?

时间:2018-07-04 13:53:00

标签: dask

我有一个微不足道的可并行化的内存问题,但是由于需要在进程之间来回发送大量数据,因此使用常规的Python多处理(仅2xish)不会带来很大的提速。希望有帮助。

我的代码基本上是这样的:

delayed_results = []
for key, kdf in natsorted(scdf.groupby(grpby_key)):
    d1 = dd.from_pandas(kdf, npartitions=1)
    d2 = dd.from_pandas(other_dfs[key], npartitions=1)

    result = dask.delayed(function)(d1, d2, key=key, n_jobs=n_jobs, **kwargs)
    delayed_results.append(result)

outdfs = dask.compute(*delayed_results)

这是我的旧作业库代码的样子:

outdfs = Parallel(n_jobs=n_jobs)(delayed(function)(scdf, other_dfs[key], key=key, n_jobs=n_jobs, **kwargs) for key, scdf in natsorted(scdf.groupby(grpby_key)))

但是,对于线程调度程序和多处理调度程序而言,轻快的代码要慢得多,并且要消耗更多的内存。我希望可以使用dask来并行化任务,而无需将内容发送给其他进程。有没有一种方法可以通过使用共享内存来同时使用多个进程?


顺便说一句。文档引用了http://distributed.readthedocs.io/en/latest/local-cluster.html,在该文档中解释了此计划程序

  

它以更复杂的方式处理数据局部性,因此可以更多   在需要的工作负载上比多处理调度程序更高效   多个过程。

但是他们没有使用它的例子。我应该用上面的代码替换dask.compute()调用以尝试本地集群吗?

1 个答案:

答案 0 :(得分:1)

所以您可以执行以下操作

wgt

默认情况下,分布式将自己注册为执行程序,您可以照常使用dask.compute