使用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
。
有关如何实现此期望行为的任何建议?感谢。
答案 0 :(得分:0)
你可以尝试一些让它运行起来的东西。一个是设置块大小,另一个是启动本地工作人员以在后台运行任务。
[这是PDF的链接,解释了如何正确使用这两个功能]
startLocalWorkers
& setChunkSize
如果没有关于数据,功能和任务的更多信息,那么很难为您提供帮助。
答案 1 :(得分:0)
如果其他人有同样的问题:
目前答案是否定的,迭代器在上传作业并将作业分配给工作人员之前完成所有任务数据的聚合。相关讨论:https://github.com/bwlewis/doRedis/issues/39
我的问题也是错误的,因为迭代器在数据上传之前就已经完成了。然而,阻塞上传导致工作者不仅要等到迭代器完成,还要等到上传完成。
如果我们实施任何更改,我会更新答案。