调用C / Fortran例程时忽略evalWithTimeout?

时间:2014-01-24 14:13:06

标签: c r igraph

我正在使用“igraph”包,以及“R.utils”中的“evalWithTimeout”功能。

我正在尝试进行最大集团检测,我知道它可能会变得非常糟糕(因为可怕的O(3 ^ n)是n节点数)所以我封装在timeOut中,但它会被忽略。

重现问题的最小代码

library(igraph) 
library(R.utils)
g<-erdos.renyi.game(1e6,1e7,type="gnm")
o<-evalWithTimeout(maximal.cliques(g),timeout=1)

这应该在一秒后停止。但事实并非如此。我想知道这是否是由于使用了底层的C / Fortran代码(这是maximal.cliques的作用)。如果是这样,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

这对大多数C代码不起作用,因为R不能中断C代码,除非C代码合作。 evalWithTimeout拨打setTimeLimit,这来自setTimeLimit的手册页:

  

只要发生用户中断,就会检查时间限制。   这将在R代码和Sys.sleep期间频繁发生,但是   仅在编译的C和Fortran代码中标识的点   代码作者。

使C代码可中断并非易事,因为您需要释放所有已分配的内存。

我建议您在https://github.com/igraph/igraph/issues报告错误,并请求maximal.cliques可以中断。