我正在将R函数转换为C以加速其运行时间。 C中的函数使用.Call从R调用,效果很好。但是,当我提供大型数据集时,它会停止。我在C代码的最开头放置了一个简单的print语句,并且该语句永远不会被打印出来,这使我相信C代码不是通过大型数据集而只是花费时间来完成,但它是首先无法前进。 此函数的仅R版本可以成功处理大型数据集,但需要大约40分钟。
是否可以通过.Call传递给C的对象大小限制?为什么R可以处理这个数据量,但不能处理.Call?
我已经能够使用R的虚拟输入数据重新创建问题: 当datsize为1300时,该功能有效。当datsize是13000(大约是我的大数据集的大小)时,函数会停止。
datsize <- 1300
# datsize <- 13000
dyn.load('loopRateMatrixThroughTimev2.so')
es1 <- round(runif(datsize, 0, 14000), 0)
es2 <- runif(datsize, 0, 200)
es3 <- runif(datsize, 0, 200)
es4 <- round(runif(13000, 0, 30), 0)
time <- runif(70, 0, 120)
lam1 <- runif(70, 0.1, 3)
lam2 <- runif(70, 0.1, 3)
mu1 <- runif(70, 0.1, 3)
tvec <- runif(100, 1, 100)
node <- -1
nodeset <- round(runif(datsize, 1, 14000), 0)
tol <- 1e-10
res <- .Call('loopRateThroughTimeMatrix', as.integer(es1), es2, es3, as.integer(es4), time, lam1, lam2, mu1, tvec, as.integer(node), as.integer(nodeset), tol)
可以在此处下载c代码和已编译的.so文件: https://dl.dropboxusercontent.com/u/34644229/cCode.zip
任何建议都将不胜感激!谢谢。
很抱歉,应该提到我在Mac OS X 10.9上运行R 3.0.2。