gpt4 book ai didi

c - 将数据从 C 传递到 R

转载 作者:IT王子 更新时间:2023-10-29 06:07:54 24 4
gpt4 key购买 nike

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

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