我正在使用“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的作用)。如果是这样,我该如何解决这个问题呢?
答案 0 :(得分:1)
这对大多数C代码不起作用,因为R不能中断C代码,除非C代码合作。 evalWithTimeout
拨打setTimeLimit
,这来自setTimeLimit
的手册页:
只要发生用户中断,就会检查时间限制。 这将在R代码和
Sys.sleep
期间频繁发生,但是 仅在编译的C和Fortran代码中标识的点 代码作者。
使C代码可中断并非易事,因为您需要释放所有已分配的内存。
我建议您在https://github.com/igraph/igraph/issues报告错误,并请求maximal.cliques
可以中断。