gpt4 book ai didi

c - 使用降雪包在 R 中使用 C-within-R 函数进行并行计算。问题 : Mac shows loading wheels and almost freezes

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:45 25 4
gpt4 key购买 nike

我有一个 R 包,其中包含 C-within-R 函数,名为 myFun。我想在我的并行计算中将其称为 myFun。这个 myFun 在我的 Mac 上本身运行良好,但是当通过并行计算函数 sfClusterApplyLB 调用它时,它显示出奇怪的行为:我的 Mac 显示加载轮并且 R 几乎卡住。一段时间后,R 停止卡住,sfClusterApplyLB 返回并行化结果。我真的很想避免这种卡住状态,因为当它卡住时我什至无法向上/向下滚动 R 控制台!

为了说明这一点,我有一个小示例代码。

我有一个小的 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")
}

“myRpack”是通过终端中的命令 R CMD INSTALL myRpack 安装到我的 Mac 上的。

这个函数 myCfun 在独立运行时工作正常。看看,

 library(myRpack)
myFun(1)

现在,我想使用 snowfall 包并行计算这个 myFun。这是用于此目的的并行计算的 R 代码:

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

然后 R 卡住了!

附言我前段时间在执行C-within-R函数(没有并行计算)时遇到了这个问题。我问这个问题Rcpp: Mac shows loading wheel and almost freeze .当时的解决方案是添加行

    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:我意识到我正在运行的脚本会在终端的 R 实例中正确执行(每个实例一次) —后续 source()ings 将挂起)。


更多背景知识,对于面临相同问题的任何其他人:我遇到它调用函数 gbm.step() dismo并行打包。我正在使用 doParallel 和 foreach 包来并行化它。 `gbm.step() 函数是一个 C 函数来拟合提升回归树模型,当我并行运行它时,它会卡住(经检查,大部分 CPU 使用是系统,而不是用户)。

我刚开始在 Mavericks 上遇到这个问题,所以我想知道它是否与 Mavericks 的 compressed memory 有关或类似的东西。

(我的最终解决方法是开始在 Linux 服务器上运行此代码,所以请物有所值。)

关于c - 使用降雪包在 R 中使用 C-within-R 函数进行并行计算。问题 : Mac shows loading wheels and almost freezes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23020228/

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