gpt4 book ai didi

r - load 不适用于 foreach 和 %dopar%

转载 作者:行者123 更新时间:2023-12-04 12:12:42 27 4
gpt4 key购买 nike

我在将对象从磁盘加载到内存时使用 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)

执行此代码的结果是(没有“>”):
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

我知道我无法使用 foreach 改进 IO,因为 IO 在我的架构上是顺序的。我只想了解为什么这不起作用......

谢谢您的回答。

问候,
萨摩。

最佳答案

我相信问题在于%do%能够写入全局环境,而 %dopar%不是。使用 %do%如果您想要 foreach(),这是非常有用的语法和其他好处,但不需要并行后端。

另外,如 %do%是按顺序完成的,保持全局环境清洁可以留给用户,因为不会有竞争条件。在并行情况下,您可能会遇到竞争条件(即某些并行任务可能会先于其他任务完成,并且可能会产生随机的、难以重现的结果)。

由于竞争条件,如果可以避免的话,将这种操作直接写入全局环境并不是一个好主意。以后的用户可以采用这样的顺序代码并替换%do%%dopar% ,希望得到更快的结果,但得不到同样的结果。值得称赞的是,您已经找到了可能发生这种情况的清晰示例。

关于r - load 不适用于 foreach 和 %dopar%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6804229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com