簡體   English   中英

使用降雪包,具有C-in-R功能的R中的並行計算。 問題:Mac顯示加載輪並幾乎死機

[英]Parallel computing in R with C-within-R functions, using snowfall package. Issue: Mac shows loading wheels and almost freezes

我有一個包含C-within-R函數的R包,名為myFun。 我想在並行計算中將此稱為myFun。 此myFun本身在Mac上可以正常運行,但是通過並行計算功能sfClusterApplyLB調用時,它表現出奇怪的行為:我的Mac顯示裝載輪,R幾乎凍結。 稍后,R停止凍結,並且sfClusterApplyLB返回並行化的結果。 我真的想避免這種凍結情況,因為凍結時我什至無法上下滾動R Console!

為了說明這一點,我有一個小的示例代碼。

我有一個小的C代碼,它會循環100次,同時每20秒打印出一次迭代次數,並在每次迭代時休眠1秒:

 # include <R.h>
 # include <Rinternals.h>
 # include <Rmath.h>
 # include <R_ext/Linpack.h>
 # include <unistd.h>

 SEXP myC (SEXP j)
  {
   for (int i = 0; i < 100; i++)
      {
        R_FlushConsole(); 
        R_ProcessEvents();
        R_CheckUserInterrupt(); 
        sleep(1); // sleep one second at each iteration. this sleep is
        // replaced by something in my code
        if (i%20==0) Rprintf("\v%d iterations are done...",i);
    }
  return (R_NilValue);
  }

我創建了一個臨時R包“ myRpack”,其中包含此myC函數及其R包裝函數myFun,其定義為:

 myFun <- function(x)
   {
    .Call("myC",
       as.integer(x),
       "myRpack")
    }

通過終端中的命令R CMD INSTALL myRpack將“ myRpack”安裝到了我的Mac。

獨立運行myCfun函數可以正常工作。 查看,

 library(myRpack)
 myFun(1)

現在,我想使用降雪包並行計算此myFun。 這是用於此目的的並行計算的R代碼:

 library("snowfall")
 sfInit(parallel=TRUE,cpus=3,type="SOCK")
 x <- 1 : 100
 res.list <- sfClusterApplyLB(x,myFun)

然后R凍結!

PS我執行C-in-R函數(不使用並行計算)時遇到了這個問題。 我向Rcpp詢問了這個問題:Mac顯示加載輪並且幾乎凍結 那時候的解決方案是添加行

    R_FlushConsole(); 
    R_ProcessEvents();
    R_CheckUserInterrupt();  

在我的C文件中(我也在代碼中做了)。 但是,此解決方案在並行計算環境中無濟於事。

我將不勝感激任何幫助。

PSS即使我將myC函數定義為:

# include <R.h>
# include <Rinternals.h>
# include <Rmath.h>
# include <R_ext/Linpack.h>
# include <unistd.h>

SEXP myC (SEXP j)
{
  const int input=INTEGER(j)[0];
  Rprintf("\n input %d",input);
  for (int i = 0; i < 100; i++)
    {
  R_FlushConsole(); 
  R_ProcessEvents();
      R_CheckUserInterrupt(); 
  sleep(1); // sleep one second at each iteration. this sleep is
      // replaced by something in my code
  if (i%20==0) Rprintf("\v%d iterations are done...",i);
}
  return (R_NilValue);
}

存在問題。

我遇到了同樣的問題,偶然發現了一種可能無法解決您的問題的解決方法。

tl; dr:我意識到我正在運行的腳本會使用較低級別的C代碼並行調用這些函數,這些腳本將掛在R GUI中,並會在終端的R實例中正確執行(每個實例一次,以后的source() ing會掛起)。


更多背景信息,對於面臨相同問題的其他人:我碰到了它,它並行地調用函數gbm.step()dismo包。 我正在使用doParallel和foreach包對其進行並行化。 gbm.step()函數使用C函數來擬合增強的回歸樹模型,當我並行運行它時,它會凍結(經檢查,CPU的大部分使用率是System,而不是User)。

我只是在Mavericks上開始遇到此問題,所以我想知道這是否與Mavericks的壓縮內存或類似問題有關。

(我的最終解決方法是開始在Linux服務器上運行此代碼,因此,請考慮它的價值。)

在您的myC函數中

SEXP myC(SEXP j){

難道不應該將“ j”轉換為C變量嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM