从C语言向R语言传递数据

3
我正在使用.C从R调用一个C函数。这是一个将运行几分钟的模拟,每隔几次迭代,我想将一些进展信息发送给R。也就是说,我不想等待C函数完成后再一次性将所有信息发送到R。
注意:我不想在R中打印(Rprintf可以做到这一点)。但我想将这样的信息传递给R。并且如果包括了R.h,使用error会将错误传递给R,但我对异常处理不感兴趣。
我的第一个方向: 我在R中使用futile.logger来记录这些内容。最好能够将此类信息传递给调用R函数使用的同一记录器,但我在网上找不到任何示例。
备选方向: 我还在使用redis将信息写入缓存,然后由连接到redis数据库的其他人使用。但我没有找到与redis的C接口。我不想使用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

你需要哪种进度信息?如果你想要消费数据,最简单的方法可能是在你的C函数中添加一个索引参数,它将只计算问题的一部分并将其输出到R,同时还提供一个索引来计算问题的下一部分。 - Karl Forner
也许这个链接对您有用:https://dev59.com/OGw15IYBdhLWcg3wYKmo。 - Tim
@KarlForner - 我正在进行模拟,因此我想每隔大约100,000次迭代输出估计的参数值。这些参数值会在到达时被另一个引擎间歇性地使用。 - user1971988
@Tim - 我必须等待函数结束才能根据链接中的想法返回。我想避免这种情况。因此,我坚持使用与日志相关的框架。 - user1971988
你的其他引擎是否在并行处理?这可能很简单,只需调用C函数计算下一个估计值,将其提供给其他引擎(可能是并行的),再次调用... - Karl Forner
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系统上使用parallel包完成,使用mcparallel来分叉子进程并使用mccollect进行通信。这种管道实现的示例不多;我认为进程需要建立一些第三方通信,比如socket(!)或redis(在R级别而不是C级别与redis通信)。也可能通过在C中分叉计算,例如使用openMP指令,但采用类似的方案--R进程调用C来轮询某个约定位置的结果。看到您的解决方案将会很有趣,例如作为问题更新;这可能有助于修改您的帖子标题以反映您正在处理的挑战。

谢谢@Martin - 现在我正在尝试使用call_R中的代码结构,在R中调用futile.logger函数flag.info。 - user1971988
另一个选择是Credis,我稍后会探索一下。然后,C和Redis都可以通过预定义的键从Redis获取信息。完成后,我会在这里发布我的结果。感谢您的帮助。 - user1971988

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接