我正在使用 .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/