gpt4 book ai didi

R:parLapply 中的错误 - $ 对原子向量无效仅发生在并行运行中

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

我试图寻找一个重复的问题,我知道很多人都问过 R 中的 parLapply,所以如果我遗漏了一个适用于我的情况的问题,我深表歉意。

问题:我有以下在 R 中正确运行的函数,但是当我尝试使用 parLapply 并行运行它时(我在 Windows 机器上),我得到了 $ operator is invalid for atomic vectors 的错误。该错误提到无论我将集群设置为多少个节点,3 个节点都会产生错误,例如,我的桌面上有 8 个内核,因此我将集群设置为 7 个节点。这是显示问题所在的示例代码:

library(parallel)
library(doParallel)
library(arrangements)

#Function

perms <- function(inputs)
{
x <- 0
L <- 2^length(inputs$w)
ip <- inputs$ip
for( i in 1:L)
{
y <- ip$getnext()%*%inputs$w
if (inputs$t >= y)
{
x <- x + 1
}
}
return(x)
}

#Inputs is a list of several other variables that are created before this
#function runs (w, t_obs and iperm), here is a reproducible example of them
#W is derived from my data, this is just an easy way to make a reproducible example


set.seed(1)
m <- 15
W <- matrix(runif(15,0,1))
iperm <- arrangements::ipermutations(0:1, m, replace = T)
t_obs <- 5

inputs <- list(W,t_obs, iperm)
names(inputs) <- c("w", "t", "ip")

#If I run the function not in parallel
perms(inputs)

#It gives a value of 27322 for this example data

这完全按预期运行,但是当我尝试并行运行以下命令时出现错误

#make the cluster
cor <- detectCores()
cl<-makeCluster(cor-1,type="SOCK")

#passing library and arguments
clusterExport(cl, c("inputs"))
clusterEvalQ(cl, {
library(arrangements)
})

results <- parLapply(cl, inputs, perms)


我得到错误:

Error in checkForRemoteErrors(val) : 
3 nodes produced errors; first error: $ operator is invalid for atomic vectors

不过,我已经使用 is.atomic() 检查是否有原子向量,并使用 is.recursive(inputs) 它说这是

我的问题是,当我尝试使用 parLapply 运行此函数时,为什么我会收到此错误,而该函数以其他方式正确运行并且是否有理由说“3 个节点产生了错误”,即使我有7 个节点?

最佳答案

它说“3 个节点”,因为当您将它传递给 parLapply 时,您只激活了三个节点。 parLapply 的第一个参数应该是事物的列表,每个元素都传递给每个节点。在你的情况下,你的 inputs 是一个列表,正确的,但它正在被分解,这样你的三个节点就可以有效地看到:

# node 1
perms(inputs[[1]]) # effectively inputs$w
# node 2
perms(inputs[[2]]) # effectively inputs$t
# node 3
perms(inputs[[3]]) # effectively inputs$ip
# nodes 4-7 idle

您可以在本地主机上复制它(不是并行):

lapply(inputs, perms)

当您这样看时,传递给节点的内容可能会变得更加明显。 (如果你想进一步查看,请执行 debug(perms) 然后运行上面的 lapply,并查看该函数调用中的 inputs看起来像。)

要让它在一个节点上运行一次(我认为这不是你想要做的),你可以这样做

parLapply(cl, list(inputs), perms)

但这只会在一个节点上运行一个实例。也许你更愿意做这样的事情:

parLapply(cl, replicate(7, inputs, simplify=FALSE), perms)

关于R:parLapply 中的错误 - $ 对原子向量无效仅发生在并行运行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57331271/

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