nleqslv内存在R中的使用
我对R中nleqslv的迭代有问题,因为解算器似乎没有清理以前迭代中使用的内存。我在一小部分代码中隔离了这个问题:nleqslv内存在R中的使用,r,R,我对R中nleqslv的迭代有问题,因为解算器似乎没有清理以前迭代中使用的内存。我在一小部分代码中隔离了这个问题: library(nleqslv) cons_ext_test <- function(x){ rows_x <- length(x)/2 x_1 <- x[1:rows_x] x_2 <- x[(rows_x+1):(rows_x*2)] eq1<- x_1-100 eq2<-x_2*10-40 return(c(eq1,eq2)) } m
library(nleqslv)
cons_ext_test <- function(x){
rows_x <- length(x)/2
x_1 <- x[1:rows_x]
x_2 <- x[(rows_x+1):(rows_x*2)]
eq1<- x_1-100
eq2<-x_2*10-40
return(c(eq1,eq2))
}
model_test <- function()
{
reserves<-(c(0:200)/200)^(2)*2000
lambda <- numeric(NROW(reserves))+5
res_ext <- pmin((reserves*.5),5)
x_test <- c(res_ext,lambda)
#print(x_test)
for(test_iter in c(1:1000))
nleqslv(x_test,cons_ext_test,jacobian=NULL)
i<- sort( sapply(ls(),function(x){object.size(get(x))}))
print(i[(NROW(i)-5):NROW(i)])
}
model_test()
任何帮助都将不胜感激
AJL还应该提到,我可以在Mac、Windows桌面和Surface Pro上复制这一功能。很好。即使将调用的结果分配给
nleqslv
,删除它然后调用垃圾收集器也不能解决问题。但是,在model\u test()
完成后调用垃圾收集器会起作用。因此,我不确定nleqslv
本身就是问题所在。R因其对内存的自由使用而臭名昭著。如果您选中memory.profile()
,您会注意到它正在保留内存。内存本身没有被填满。在运行gc()
之前,实际使用了大约770Mb,剩下的2.4GB只是保留的。这通常是您应该邮寄给维护人员的。我怀疑nleqslv
是罪魁祸首。fortran代码不分配内存。封装的C代码确实如此,并且在释放内存时非常小心。我将尝试找出是否应该归咎于nleqslv
,以及是否必须改变某些事情。@Joris Meys:AndrewLeach已经联系过我,我用一个小例子重现了这个问题。我还不能完全确定,但我认为默认的JIT级别会导致这种情况。使用JIT级别0似乎可以解决这个问题。我在等安德鲁的答复。如果它是默认的JIT级别,那么它可能是R中的一个错误。这是可以报告的。@Joris Meys:问题是JIT执行中的一个错误。自R-3.4起,问题已解决。-已修补r72789。
test_iter lambda res_ext reserves x_test
48 1648 1648 1648 3256