2

「並列化」段階に到達する必要がある R コードがあります。これは初めてなので、間違った用語を使用している場合はご容赦ください。私には、一度に 1 人 1 人を一気飲みし、最終的には個人全体で平均化するだけのプロセスがあります。プロセスは各個人 (ブラウン橋) でまったく同じです。これを 300 人以上の個人に対して行うだけです。だから、ここの誰かが私のコードを変更して生成できるようにする方法を知っていることを望んでいましたか? または並列化?または、私が今アクセスできる 48 個の CPU が、私の小さなラップトップでこれを計算するのにかかる 58 日を短縮するのに役立つことを確認するための言葉が何であれ. 私の頭の中では、1 人の個人を 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
4

3 に答える 3

4

これは一般的な例です。すべてのコードを読む忍耐力がなかったからです。これを複数のプロセッサに分散させる最も簡単な方法の 1 つは、multicoreライブラリとmclapply(の並列化されたバージョンlapply) を使用してリストをプッシュすることです (リストの個々の項目は、この場合、300 以上の個人それぞれのデータフレームになります)。機能。

例:

library(multicore)
result=mclapply(data_list, your_function,mc.preschedule=FALSE, mc.set.seed=FALSE)
于 2011-08-17T02:25:11.597 に答える
4

これが反対票を投じられた理由もわかりません。foreachパッケージはあなたが求めているものだと思います。これらの最初のいくつかの pdf には、非常に明確な有用な情報が含まれています。基本的には、各人に何をしてもらいたいかを機能​​として記述します。次に foreach を使用して、ある人物のデータをノードに送信して関数を実行し (別の人物を別のノードに送信するなど)、rbind などを使用してすべての結果をコンパイルします。私はこれを数回使用しましたが、素晴らしい結果が得られました。

編集:コードを作り直すつもりはありませんでした。これまでのところ、関数にラップして1つのライナーforeachを使用するスキルが簡単に得られると考えているからです。

編集 2: コメントが返信するには長すぎました。

私はあなたがコードでそれを関数に入れることができると思っていたので、あなたはそれを関数に入れることができると思いました:)あなたがまだこれに取り組んでいるなら、あなたのサブジェクトをループするforループを書くことを考えるのに役立つかもしれません。その科目に必要な計算。次に、その for ループが関数に必要なものです。あなたのコードでは、「area.grid」まですべてだと思います。データは反復ごとに 1 回だけサブセット化されるため、[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)}
)

いくつかのテストデータがなければ、それがそれであるかどうかを言うのは難しいです.どうやってうまくいくか教えてください.

于 2011-08-17T02:01:13.647 に答える
2

あなたの説明を理解しているように、分散コンピュータークラスターにアクセスできます。そのため、マルチコア パッケージは機能しません。Rmpi、snow、または foreach を使用する必要があります。既存のループ構造に基づいて、 foreach および doSnow パッケージを使用することをお勧めします。しかし、多くのデータがあるため、コードは次のようになります。おそらく、ノードに送信されるデータ (必要なもののみ) を減らすためにチェックする必要があります。

于 2011-08-17T09:57:01.477 に答える