Tyl*_*ker 34 parallel-processing r
我在这里问了一个相关的问题并且响应运行良好: 使用parallel的parLapply:无法访问并行代码中的变量
问题是,当我尝试使用函数内部的答案时,它将无法工作,因为我认为它具有默认环境clusterExport
.我已经阅读了小插图并查看了帮助文件,但我的知识库非常有限.我使用的方式我parLapply
期望它的行为类似lapply
但似乎没有.
这是我的尝试:
par.test <- function(text.var, gc.rate=10){
ntv <- length(text.var)
require(parallel)
pos <- function(i) {
paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}
cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("text.var", "ntv", "gc.rate", "pos"))
parLapply(cl, seq_len(ntv), function(i) {
x <- pos(text.var[i])
if (i%%gc.rate==0) gc()
return(x)
}
)
}
par.test(rep("I like cake and ice cream so much!", 20))
#gives this error message
> par.test(rep("I like cake and ice cream so much!", 20))
Error in get(name, envir = envir) : object 'text.var' not found
Run Code Online (Sandbox Code Playgroud)
GSe*_*See 43
默认情况下,clusterExport
查找.GlobalEnv
要导出的要导出的对象varlist
.如果您的对象不在.GlobalEnv
,您必须告诉clusterExport
它可以在哪个环境中找到这些对象.
您可以将您更改clusterExport
为以下(我没有测试,但您说在评论中工作)
clusterExport(cl=cl, varlist=c("text.var", "ntv", "gc.rate", "pos"), envir=environment())
Run Code Online (Sandbox Code Playgroud)
这样,它将在函数的环境中查找要导出的对象.
Mar*_*gan 16
另一种解决方案是将附加变量作为函数的参数包含在内; parLapply也出口它们.如果'text.var'是大数据,那么它应该使它成为应用于的参数而不是索引,因为那时只导出与每个worker相关的text.var部分,而不是整个对象对每个工人.
par.test <- function(text.var, gc.rate=10){
require(parallel)
pos <- function(i) {
paste(sapply(strsplit(tolower(i), " "), nchar), collapse=" | ")
}
cl <- makeCluster(mc <- getOption("cl.cores", 4))
parLapply(cl, text.var, function(text.vari, gc.rate, pos) {
x <- pos(text.vari)
if (i%%gc.rate==0) gc()
x
}, gc.rate, pos)
}
Run Code Online (Sandbox Code Playgroud)
这在概念上也令人愉悦.(很少需要显式调用垃圾收集器).
source()
脚本中的内存管理会导致其他问题.相比
> stop("oops")
Error: oops
> traceback()
1: stop("oops")
Run Code Online (Sandbox Code Playgroud)
在脚本中使用相同的调用
> source("foo.R")
Error in eval(ei, envir) : oops
> traceback()
5: stop("oops") at foo.R#1
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("foo.R")
Run Code Online (Sandbox Code Playgroud)
请记住R的serialize()
功能,内部parLapply()
用于将数据移动到工作人员,将所有内容序列化到.GlobalEnv.因此,在脚本中创建的数据对象被序列化为worker,而如果以交互方式运行,则它们不会被序列化.这可能是运行脚本时遇到@ SeldeomSeenSlim的问题.可能解决方案是更清楚地将"数据"与"算法"分开,例如,使用文件系统或数据库或......来存储对象.
归档时间: |
|
查看次数: |
15428 次 |
最近记录: |