From bhh at xs4all.nl  Mon Jun 12 19:33:25 2017
From: bhh at xs4all.nl (Berend Hasselman)
Date: Mon, 12 Jun 2017 19:33:25 +0200
Subject: [Rd] Possible with enableJIT function
Message-ID: <05109DDA-8981-48AC-AFBA-AF2EE3C5471A@xs4all.nl>



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



[Rd] Possible with enableJIT function
Berend Hasselman