我是新来的人-我已搜索但找不到我的问题的答案。我已经在两台不同的机器上使用parallel
包运行了以下R并行化代码(来自R中并行计算的blog),但是得到的处理时间却截然不同。第一台机器是带有Windows 8、8GB RAM,Intel i7、2核/4逻辑处理器的Lenovo笔记本电脑。第二台计算机是Dell台式机,Windows 7、16GB RAM,Intel i7、4核/8逻辑处理器。该代码有时在第二台计算机上运行得慢得多。我相信原因是第二台计算机未使用工作程序节点来完成任务。当我使用snow
包中的函数snow.time()检查节点使用情况时,第一台计算机正在使用所有可用的工作程序来完成任务。但是,在功能更强大的计算机上,它从不使用 worker -整个任务都由主服务器处理。为什么第一台机器使用 worker ,而第二台机器没有完全相同的代码?我如何“强制”第二台机器使用可用的工作程序,以使代码真正地并行化并加快处理时间?这些问题的答案将极大地帮助我完成我正在从事的其他工作。提前致谢。下面是函数snow.time()
的图形以及我使用的代码:
runs <- 1e7
manyruns <- function(n) mean(unlist(lapply(X=1:(runs/4), FUN=onerun)))
library(parallel)
cores <- 4
cl <- makeCluster(cores)
# Send function to workers
tobeignored <- clusterEvalQ(cl, {
onerun <- function(.){ # Function of no arguments
doors <- 1:3
prize.door <- sample(doors, size=1)
choice <- sample(doors, size=1)
if (choice==prize.door) return(0) else return(1) # Always switch
}
; NULL
})
# Send runs to the workers
tobeignored <- clusterEvalQ(cl, {runs <- 1e7; NULL})
runtime <- snow.time(avg <- mean(unlist(clusterApply(cl=cl, x=rep(runs, 4), fun=manyruns))))
stopCluster(cl)
plot(runtime)
最佳答案
我认为不可能从snow软件包中使用snow.timing
函数,而从并行软件包中获取所有其他函数。 R 3.2.3中的并行源具有一些用于计时的占位符代码,但是在雪中它似乎不完整或不兼容snow.timing
函数。我认为您仍然可以从clusterApply
获得正确的结果,但是snow.time
返回的对象将等效于执行:
runtime <- snow.time(Sys.sleep(20))
如果您想使用
snow.timing
,尽管您仍然可以使用detectCores
语法访问parallel::detectCores()
之类的功能,但我建议仅加载snow。我真的不知道为什么您的脚本偶尔在台式机上运行缓慢,但是我认为并行化的方式是合理且正确的。您可能要尝试在两台计算机上依次对
manyruns
进行基准测试,以排除两个系统上随机数生成代码的任何差异。但是问题可能出在系统服务减慢了整个系统的速度。关于r - 如何强制闲置 worker 从事并行R的工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34584196/