gpt4 book ai didi

r - 如何为多核处理重写我的 R 代码?

转载 作者:行者123 更新时间:2023-12-02 06:22:19 24 4
gpt4 key购买 nike

我有 R 代码需要进入“并行化”阶段。我是新手,所以如果我使用了错误的术语,请原谅我。我有一个过程,一次只需要一个一个地通过一个人,然后最后对每个人进行平均。这个过程对每个人来说都是完全一样的(它是一个布朗桥),我只需要为超过 300 个人做这个。所以,我希望这里有人可能知道如何更改我的代码以便生成它?或并行化?或者无论用什么词来确保我现在可以访问的 48 个 CPU 可以帮助减少用我的小笔记本电脑计算这个所需的 58 天。在我的脑海里,我只会派出 1 个人到一个处理器。让它通过脚本运行,然后发送另一个……如果这有意义的话。

下面是我的代码。我试图在其中发表评论,并指出了我认为代码需要更改的地方。

for (n in 1:(length(IDNames))){ #THIS PROCESSES THROUGH EACH INDIVIDUAL 

#THIS FIRST PART IS JUST EXTRACTING THE DATA FROM MY TWO INPUT FILES.
#I HAVE ONE FILE WITH ALL THE LOCATIONS AND THEN ANOTHER FILE WITH A DATE RANGE.
#EACH INDIVIDUAL HAS DIFFERENT DATE RANGES, THUS IT HAS TO PULL OUT EACH INDIVIDUALS
#DATA SET SEPARATELY AND THEN RUN THE FUNCTION ON IT.

IndivData = MovData[MovData$ID==IDNames[n],]
IndivData = IndivData[1:(nrow(IndivData)-1),]
if (UseTimeWindow==T){
IndivDates = dates[dates$ID==IDNames[n],]
IndivData = IndivData[IndivData$DateTime>IndivDates$Start[1]&IndivData$DateTime<IndivDates$End[1],]
}
IndivData$TimeDif[nrow(IndivData)]=NA

########################
#THIS IS THE PROCESS WHERE I THINK I NEED THAT HAS TO HAVE EACH INDIVIDUAL RUN THROUGH IT

BBMM <- brownian.bridge(x=IndivData$x, y=IndivData$y,
time.lag = IndivData$TimeDif[1:(nrow(IndivData)-1)], location.error=20,
area.grid = Grid, time.step = 0.1)

#############################
# BELOW IS JUST CODE TO BIND THE RESULTS INTO A GRID DATA FRAME I ALREADY CREATED.
#I DO NOT UNDERSTAND HOW THE MULTICORE PROCESSED CODE WOULD JOIN THE DATA BACK
#WHICH IS WHY IVE INCLUDED THIS PART OF THE CODE.

if(n==1){ #creating a data fram with the x, y, and probabilities for the first individual
BBMMProbGrid = as.data.frame(1:length(BBMM[[2]]))
BBMMProbGrid = cbind(BBMMProbGrid,BBMM[[2]],BBMM[[3]],BBMM[[4]])
colnames(BBMMProbGrid)=c("GrdId","X","Y",paste(IDNames[n],"_Prob", sep=""))
} else { #For every other individual just add the new information to the dataframe
BBMMProbGrid = cbind(BBMMProbGrid,BBMM[[4]])
colnames(BBMMProbGrid)[n*2+2]=paste(IDNames[n],"_Prob", sep ="")
}# end if


} #end loop through individuals

最佳答案

也不知道为什么这个被否决了。我认为 foreach包裹就是你想要的。前几个 pdf 中包含非常清晰的有用信息。基本上把你想为每个人做的事情写成一个函数。然后使用 foreach 将一个人的数据发送到一个节点以运行该函数(同时将另一个人发送到另一个节点等),然后它使用 rbind 之类的东西编译所有结果。我已经用过几次,效果很好。

编辑:我并没有打算重新编写您的代码,因为我认为您已经做到了这一点,您将很容易掌握将其包装到一个函数中然后使用一个 liner foreach 的技能。

编辑 2:评论太长无法回复您。

我想既然你已经对代码有了足够的了解,你就可以把它变成一个函数 :) 如果你还在研究这个,考虑写一个 for 循环来循环你的代码可能会有所帮助主题并进行该主题所需的计算。然后,那个 for 循环就是你想要的函数。我认为在您的代码中,一切都归结为“area.grid”。然后你可以摆脱你的大部分 [n] 因为数据每次迭代只有一次子集。

也许:

pernode <- function(MovData) {
IndivData = MovData[MovData$ID==IDNames[i],]
IndivData = IndivData[1:(nrow(IndivData)-1),]
if (UseTimeWindow==T){
IndivDates = dates[dates$ID==IDNames,]
IndivData = IndivData[IndivData$DateTime>IndivDates$Start[1]
&IndivData$DateTime<IndivDates$End[1],]
}
IndivData$TimeDif[nrow(IndivData)]=NA

BBMM <- brownian.bridge(x=IndivData$x, y=IndivData$y,
time.lag = IndivData$TimeDif[1:(nrow(IndivData)-1)], location.error=20,
area.grid = Grid, time.step = 0.1)

return(BBMM)
}

然后是这样的:

library(doMC)
library(foreach)
registerDoMC(cores=48) # or perhaps a few less than all you have

system.time(
output <- foreach(i = 1:length(IDNames)), .combine = "rbind", .multicombine=T,
.inorder = FALSE) %dopar% {pernode(i)}
)

如果没有一些测试数据,很难说是不是这样,让我知道你的进展情况。

关于r - 如何为多核处理重写我的 R 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7087030/

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