在将对象从磁盘加载到内存时,我遇到了使用foreach%dopar%的一些问题...当我在使用foreach%dopar%时尝试加载它时没有加载对象(当我只使用%do%时它可以工作)下面是一个显示我的问题的简单示例.
envir = .GlobalEnv
x <- "X test"
y <- "Y test"
z <- "Z test"
save(x, file="x.RData")
save(y, file="y.RData")
save(z, file="z.RData")
rm(x)
rm(y)
rm(z)
objectsNamesVector <- c("x", "y", "z")
foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %do% {
print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep=""))
load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir)
}
print(x)
print(y)
print(z)
rm(x)
rm(y)
rm(z)
foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %dopar% {
print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep=""))
load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir)
}
print(x)
print(y)
print(z)
Run Code Online (Sandbox Code Playgroud)
执行此代码的结果是(没有">"):
envir = .GlobalEnv
x <- "X test"
y <- "Y test"
z <- "Z test"
save(x, file="x.RData")
save(y, file="y.RData")
save(z, file="z.RData")
rm(x)
rm(y)
rm(z)
objectsNamesVector <- c("x", "y", "z")
foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %do% {
+ print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep=""))
+ load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir)
+ }
[1] "Loading object x - 1 of 3"
[1] "Loading object y - 2 of 3"
[1] "Loading object z - 3 of 3"
NULL
print(x)
[1] "X test"
print(y)
[1] "Y test"
print(z)
[1] "Z test"
rm(x)
rm(y)
rm(z)
foreach(i=1:length(objectsNamesVector), .combine=function (...) NULL, .multicombine=TRUE) %dopar% {
+ print(paste("Loading object ", objectsNamesVector[i]," - ", i, " of ", length(objectsNamesVector), sep=""))
+ load(file=paste(objectsNamesVector[i], ".RData", sep=""), envir=envir)
+ }
NULL
print(x)
Error in print(x) : object 'x' not found
print(y)
Error in print(y) : object 'y' not found
print(z)
Error in print(z) : object 'z' not found
Run Code Online (Sandbox Code Playgroud)
我知道我不能用foreach改进IO,因为IO在我的架构上是顺序的.我想了解为什么这不起作用......
谢谢您的回答.
此致,萨莫.
我认为问题在于%do%能够写入全局环境,而 则%dopar%不能。如果您想要语法和其他好处,但不需要并行后端,那么使用%do%非常有用。foreach()
此外,由于这%do%是按顺序完成的,因此可以将保持全局环境清洁的任务留给用户,因为不会出现竞争条件。在并行情况下,您可能会遇到竞争条件(即某些并行任务可能会先于其他任务完成,并且可能会产生随机的、难以重现的结果)。
由于竞争条件,如果可以避免的话,将这种操作直接写入全局环境并不是一个好主意。后来的用户可能会采用这样的顺序代码并替换%do%为%dopar%,希望获得更快的结果,但不会获得相同的结果。值得赞扬的是,您已经找到了一个清楚的例子来说明这种情况可能发生的情况。