Alexander Shenkin
2016-Sep-13 13:05 UTC
[R] Maximum # of DLLs reached, or, how to clean up after yourself?
Hello all, I have a number of analyses that call bunches of sub-scripts, and in the end, I get the "maximal number of DLLs reached" error. This has been asked before (e.g. http://stackoverflow.com/questions/36974206/r-maximal-number-of-dlls-reached), and the general answer is, "just clean up after yourself". Assuming there are no plans to raise this 100-DLL limit in the near future, my question becomes, what is best practice for cleaning up (detaching) loaded packages in scripts, when those scripts are sometimes called from other scripts? One can detach all packages at the end of a script that were loaded at the beginning of the script. However, if a package is required in a calling script, one should really make sure it hadn't been loaded prior to sub-script invocation before detaching it. I could write a custom function that pushes and pops package names from a global list, in order to keep track, but maybe there's a better way out there... Thanks for any thoughts. Allie
Henrik Bengtsson
2016-Sep-13 18:23 UTC
[R] Maximum # of DLLs reached, or, how to clean up after yourself?
In R.utils (>= 2.4.0), which I hope to submitted to CRAN today or tomorrow, you can simply call: R.utils::gcDLLs() It will look at base::getLoadedDLLs() and its content and compare to loadedNamespaces() and unregister any "stray" DLLs that remain after corresponding packages have been unloaded. Until the new version is on CRAN, you can install it via source("http://callr.org/install#HenrikBengtsson/R.utils at develop") or alternatively just source() the source file: source("https://raw.githubusercontent.com/HenrikBengtsson/R.utils/develop/R/gcDLLs.R") DISCUSSION: (this might be better suited for R-devel; feel free to move it there) As far as I understand the problem, running into this error / limit is _not_ the fault of the user. Instead, I'd argue that it is the responsibility of package developers to make sure to unregister any registered DLLs of theirs when the package is unloaded. A developer can do this by adding the following to their package: .onUnload <- function(libpath) { library.dynam.unload(utils::packageName(), libpath) } That should be all - then the DLL will be unloaded as soon as the package is unloaded. I would like to suggest that 'R CMD check' would include a check that asserts when a package is unloaded it does not leave any registered DLLs behind, e.g. * checking whether the namespace can be unloaded cleanly ... WARNING Unloading the namespace does not unload DLL * checking loading without being on the library search path ... OK For further details on my thoughts on this, see https://github.com/HenrikBengtsson/Wishlist-for-R/issues/29. Hope this helps Henrik On Tue, Sep 13, 2016 at 6:05 AM, Alexander Shenkin <ashenkin at ufl.edu> wrote:> Hello all, > > I have a number of analyses that call bunches of sub-scripts, and in the > end, I get the "maximal number of DLLs reached" error. This has been asked > before (e.g. > http://stackoverflow.com/questions/36974206/r-maximal-number-of-dlls-reached), > and the general answer is, "just clean up after yourself". > > Assuming there are no plans to raise this 100-DLL limit in the near future, > my question becomes, what is best practice for cleaning up (detaching) > loaded packages in scripts, when those scripts are sometimes called from > other scripts? One can detach all packages at the end of a script that were > loaded at the beginning of the script. However, if a package is required in > a calling script, one should really make sure it hadn't been loaded prior to > sub-script invocation before detaching it. > > I could write a custom function that pushes and pops package names from a > global list, in order to keep track, but maybe there's a better way out > there... > > Thanks for any thoughts. > > Allie > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
Alexander Shenkin
2016-Sep-14 08:49 UTC
[R] Maximum # of DLLs reached, or, how to clean up after yourself?
Hi Henrik, Thanks for your reply. I didn't realize that floating DLLs were an issue (good to know). My query is actually a bit more basic. I'm actually wondering how folks manage their loading and unloading of packages when calling scripts within scripts. Quick example: Script1: library(package1) source("script2.r") # do stuff reliant on package1 detach("package:package1", unload=TRUE) Script2: library(package1) library(package2) # do stuff reliant on package1 and package2 detach("package:package1", unload=TRUE) detach("package:package2", unload=TRUE) Script2 breaks Script1 by unloading package1 (though unloading package2 is ok). I will have to test whether each package is loaded in Script2 before loading it, and use that list when unloading at the end of the Script2. *Unless there's a better way to do it* (which is my question - is there?). I'm possibly just pushing the whole procedural scripting thing too far, but I also think that this likely isn't uncommon in R. Any thoughts greatly appreciated! Thanks, Allie On 9/13/2016 7:23 PM, Henrik Bengtsson wrote:> In R.utils (>= 2.4.0), which I hope to submitted to CRAN today or > tomorrow, you can simply call: > > R.utils::gcDLLs() > > It will look at base::getLoadedDLLs() and its content and compare to > loadedNamespaces() and unregister any "stray" DLLs that remain after > corresponding packages have been unloaded. > > Until the new version is on CRAN, you can install it via > > source("http://callr.org/install#HenrikBengtsson/R.utils at develop") > > or alternatively just source() the source file: > > source("https://raw.githubusercontent.com/HenrikBengtsson/R.utils/develop/R/gcDLLs.R") > > > DISCUSSION: > (this might be better suited for R-devel; feel free to move it there) > > As far as I understand the problem, running into this error / limit is > _not_ the fault of the user. Instead, I'd argue that it is the > responsibility of package developers to make sure to unregister any > registered DLLs of theirs when the package is unloaded. A developer > can do this by adding the following to their package: > > .onUnload <- function(libpath) { > library.dynam.unload(utils::packageName(), libpath) > } > > That should be all - then the DLL will be unloaded as soon as the > package is unloaded. > > I would like to suggest that 'R CMD check' would include a check that > asserts when a package is unloaded it does not leave any registered > DLLs behind, e.g. > > * checking whether the namespace can be unloaded cleanly ... WARNING > Unloading the namespace does not unload DLL > * checking loading without being on the library search path ... OK > > For further details on my thoughts on this, see > https://github.com/HenrikBengtsson/Wishlist-for-R/issues/29. > > Hope this helps > > Henrik > > On Tue, Sep 13, 2016 at 6:05 AM, Alexander Shenkin <ashenkin at ufl.edu> wrote: >> Hello all, >> >> I have a number of analyses that call bunches of sub-scripts, and in the >> end, I get the "maximal number of DLLs reached" error. This has been asked >> before (e.g. >> http://stackoverflow.com/questions/36974206/r-maximal-number-of-dlls-reached), >> and the general answer is, "just clean up after yourself". >> >> Assuming there are no plans to raise this 100-DLL limit in the near future, >> my question becomes, what is best practice for cleaning up (detaching) >> loaded packages in scripts, when those scripts are sometimes called from >> other scripts? One can detach all packages at the end of a script that were >> loaded at the beginning of the script. However, if a package is required in >> a calling script, one should really make sure it hadn't been loaded prior to >> sub-script invocation before detaching it. >> >> I could write a custom function that pushes and pops package names from a >> global list, in order to keep track, but maybe there's a better way out >> there... >> >> Thanks for any thoughts. >> >> Allie >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code.