[Rd] Possible with enableJIT function
Berend Hasselman
bhh at xs4all.nl
Mon Jun 12 19:33:25 CEST 2017
In this email to the R-help list: https://stat.ethz.ch/pipermail/r-help/2017-June/447474.html
and in this question on Stackoverflow: https://stackoverflow.com/questions/44486643/nleqslv-memory-use-in-r
Andrew Leach has raised a question about the memory usage of my package nleqslv.
In a model with a loop within a function he has experienced continuously increasing memory usage
by package nleqslv leading to an out of memory condition.
I have been able to reproduce the continuously increasing memory usage with the following small example.
<code>
library(nleqslv,lib.loc="../nleqslv.Rcheck")
library(pryr)
dslnex <- function(x) {
y <- numeric(2)
y[1] <- x[1]^2 + x[2]^2 - 2
y[2] <- exp(x[1]-1) + x[2]^3 - 2
y
}
xstart <- c(x1=1.5,x2=2)
nsims <- 10
for(test_iter in seq_len(nsims)){
z <- nleqslv(xstart,dslnex,jacobian=NULL)
print(paste("nleqslv iteration",test_iter,"and memory used is",mem_used()))
}
memory.profile()
gc()
print(paste("At end memory used is", mem_used()))
</code>
The final output is
<output>
[1] "nleqslv iteration 1 and memory used is 28921288"
[1] "nleqslv iteration 2 and memory used is 29133256"
[1] "nleqslv iteration 3 and memory used is 29132992"
[1] "nleqslv iteration 4 and memory used is 29134712"
[1] "nleqslv iteration 5 and memory used is 29136432"
[1] "nleqslv iteration 6 and memory used is 29138152"
[1] "nleqslv iteration 7 and memory used is 29139872"
[1] "nleqslv iteration 8 and memory used is 29141592"
[1] "nleqslv iteration 9 and memory used is 29143312"
[1] "nleqslv iteration 10 and memory used is 29145032"
>
> memory.profile()
NULL symbol pairlist closure environment promise
1 8554 194726 4230 1065 6534
language special builtin char logical integer
51374 45 671 9786 8030 37258
double complex character ... any list
2645 1 53795 0 0 18487
expression bytecode externalptr weakref raw S4
1 14662 2233 592 593 1049
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 416340 22.3 750400 40.1 581181 31.1
Vcells 726127 5.6 1308461 10.0 1191521 9.1
> print(paste("At end memory used is", mem_used()))
[1] "At end memory used is 29126472"
</output>
Indeed memory used increases in each pass of the for loop.
I have added these two lines at the top of the code after the library(pryr) invocation.
library(compiler)
oldJIT <- enableJIT(0)
This resolves the issue in the sense that memory used remains constant after the first iteration.
Output in the for loop is now:
<output>
[1] "nleqslv iteration 1 and memory used is 24487784"
[1] "nleqslv iteration 2 and memory used is 24495816"
[1] "nleqslv iteration 3 and memory used is 24495816"
[1] "nleqslv iteration 4 and memory used is 24495816"
[1] "nleqslv iteration 5 and memory used is 24495816"
[1] "nleqslv iteration 6 and memory used is 24495816"
[1] "nleqslv iteration 7 and memory used is 24495816"
[1] "nleqslv iteration 8 and memory used is 24495816"
[1] "nleqslv iteration 9 and memory used is 24495816"
[1] "nleqslv iteration 10 and memory used is 24495816"
</output>
My questions are
- is this a bug(let) in the JIT compiler?
- if it isn't what would need to be changed in nleqslv.R in the package source? (I haven't a clue)
regards
Berend Hasselman
My sessionInfo:
R version 3.4.0 (2017-04-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.5
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib
locale:
[1] en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.4.0
More information about the R-devel
mailing list