0

使用 foreach 和 doRedis 时,doRedis 工作人员会等到所有作业都到达 redis 服务器后再开始处理。是否可以在所有预处理完成之前让它们开始?

我正在使用一个运行良好的迭代器 - 预处理“及时”发生,并且随着迭代器的运行,作业数据开始到达服务器。不过,我似乎无法利用这种行为,因为工作人员只是等到所有工作都上传完毕。

示例代码:

library(foreach)
library(doRedis)

registerDoRedis("worklist", "0.0.0.0")

foreach (var = complex.iter(1:1E6)) %dopar% {
    process.function(var)
    }

在这个例子complex.iter中需要一段时间,并且有很多元素需要迭代。process.function()因此,如果工作人员在所有预处理完成之前开始运行,那就太好了。不幸的是,他们似乎要等到complex.iter在所有元素上运行。

我已经设置了.inorder=F

关于如何实现这种期望行为的任何建议?谢谢。

4

2 回答 2

0

你可以尝试一些事情来让它运行起来。一种是设置块大小,另一种是启动本地工作人员以在后台执行任务。

[这里是解释如何正确使用这两个功能的 PDF 链接]

startLocalWorkers&setChunkSize

如果没有关于数据、功能和任务的更多信息,就很难为您提供更多帮助。

于 2016-08-06T05:22:04.813 回答
0

如果其他人有同样的问题:

目前的答案是否定的,迭代器在上传和分发作业给工人之前完成所有任务数据的聚合。这里的相关讨论:https ://github.com/bwlewis/doRedis/issues/39

我的问题也是错误的,因为迭代器在数据上传之前就完成了。尽管如此,阻塞上传导致工作人员不仅要等到迭代器完成,还要等到上传完成。

如果我们实施任何更改,我会更新答案。

于 2016-08-09T19:41:27.843 回答