[英]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.