2014-01-24 33 views
2

我正在使用「igraph」包和「R.utils」中的「evalWithTimeout」函數。我試圖做最大集團檢測,我知道它可以變得糟糕(因爲n(n^n)是可怕的節點數),所以我封裝在timeOut中,但它被忽略。調用C/Fortran例程時忽略evalWithTimeout?

最少的代碼來重現問題

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

這不適用於大多數C代碼,因爲R不能中斷C代碼,除非C代碼協作。 evalWithTimeout調用setTimeLimit,這是從手動頁從setTimeLimit:每當可能發生用戶中斷

時間限制進行​​檢查。 這將經常發生在R代碼和Sys.sleep中,但 僅在編譯C和Fortran代碼中由 代碼作者標識的點處發生。

讓C代碼中斷是不平凡的,因爲你需要釋放所有分配的內存。

我建議舉報https://github.com/igraph/igraph/issues的錯誤,並要求使maximal.cliques中斷。

+0

但是讓C代碼中斷是非常微不足道的......你只需要在戰略位置調用'R_checkUserInterrupt()'。 –

+1

不,這不是微不足道的,因爲您需要釋放內存,如果您調用的C函數調用其他C函數等,這並不重要。 –