c - 将数据从 C 传递到 R

标签 c r logging redis

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

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

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

备选方向: 我还使用 redis 在缓存中写入信息,然后由连接到 redis 数据库的其他人使用。但是我没有找到redis的任何C接口(interface)。我不想使用 Lua。我找到的最接近的是 Writing a Custom Redis Command In C - Part 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

最佳答案

您实际上是在要求在较短的管道中进行并行计算。执行此操作的“最简单”方法可能是使用套接字连接,遵循 ?socketConnection 上的示例“两个 R 进程通过非阻塞套接字进行通信”,并结合 @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 级别而不是 C 级别与 redis 通信)。也可以使用例如 openMP 指令但使用类似的方案在 C 中 fork 计算——R 进程调用 C 以在某个商定的位置轮询结果。看到您的解决方案会很有趣,例如,作为对您问题的更新;修改您的帖子标题以反射(reflect)您正在应对的挑战可能会有所帮助。

关于c - 将数据从 C 传递到 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18953732/

相关文章:

在不知道语言的情况下大小写 UTF-8

编译器错误 : "‘e’ was not declared in this scope"in C code

c - c函数中的指针 "value computed is not used"

java - Log4j 属性不适用于 SLF4J

c# - 用于 C、C# 或 Java 的 OSX/Windows GUI 构建器的库和/或程序选项

r - 如何创建 namespace 并将函数导出到其中?

r - 否定dplyr管道中的 `!`

mysql - r-mysql : use r variable to fetch a column from database

python - Flask 跨多个模块进行日志记录

unit-testing - 如何在grails test-app中查看网络流量? -也许是RESTClient日志记录?