3

我正在使用 R 从 R 调用 C 函数.C。这是一个将运行几分钟的模拟,并且每隔几次迭代,我想向 R 发送一些进度信息。也就是说,我不想等到 C 函数完成发送所有信息到一次到R。

注意:我不想在 R 中打印(Rprintf这样做)。但我想将此类信息传递给 R。error如果包含,也使用将错误传递给 R R.h,但我对异常处理不感兴趣。

我的第一个方向:我futile.logger在 R 中使用来记录这些东西。最好,如果可以将此类信息传递给调用 R 函数正在使用的同一记录器,那就太好了。但我在网上找不到任何例子。

替代方向:我也在使用redis将信息写入缓存,然后由连接到redis db的其他人使用。但是我没有找到redis的任何C接口。我不想使用 Lua。我发现的最接近的是用 C 编写自定义 Redis 命令 - 第 2 部分

但在我看来,我的需求要简单得多。有任何想法吗?

更新:这就是我希望这能理想地工作的方式。

# PART 1: webserver calls R function

# the R call
res = .C("montecarlo_sampler.c", as.matrix(inputData), as.matrix(ouputData), as.integer(iterations))


// PART 2: the C function

void montecarlo_sampler( double *inputData, double *outputData, int *iterations){

  // do some preprocessing
  int iter =1;
  while(iter<1000000){

    if(iter % 1000 == 0) {
      // summarize output from last 1000 iterations
      // dump summary data to a logger or redis
    }

    // do usual sampling stuff in C
  }
}

PART 3:
// listening on the django side
// polls redis every few seconds to see if update has reached.
// sends summary output for visualization to client
4

1 回答 1

0

您确实要求在短管道中进行并行计算。执行此操作的“最简单”方法可能是使用套接字连接,遵循示例“两个 R 进程通过非阻塞套接字进行通信” ?socketConnection,并结合 @KarlForner 的建议。过程 1 将

repeat {
    ## get input from process 2
    ## do R calculations
}

另一个过程将

repeat {
    ## call C for a chunk of results
    ## forward result to process 1
}

这也可以通过非 Windows 上的并行包来完成,mcparallel用于分叉子进程并与mccollect. 这种流水线实现的例子并不多;我认为这些进程必须建立一些第三方通信,例如套接字(!)或 redis(在 R 级别与 redis 通信,而不是 C)。也可以在 C 中分叉计算,例如使用 openMP 指令,但采用类似的方案——R 进程调用 C 以在某个商定的位置轮询结果。看到您的解决方案会很有趣,例如,作为您问题的更新;修改帖子的标题以反映您正在应对的挑战可能会有所帮助。

于 2013-09-23T12:37:20.053 回答