错误:达到的最大DLL数

时间:2016-05-02 02:27:00

标签: r dll package

我正在写一个R包,它取决于许多其他包。当我在会话中加载太多包时,我经常遇到这个错误:

Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/proxy/libs/proxy.so':
  `maximal number of DLLs reached...

这篇文章Exceeded maximum number of DLLs in R指出问题在于基本R代码的Rdynload.c: #define MAX_NUM_DLLS 100

除了从源代码修改和构建之外,有没有办法绕过这个问题?

4 个答案:

答案 0 :(得分:19)

从R 3.4起,您可以使用环境变量R_MAX_NUM_DLLS设置不同的最大DLL数。从发行说明:

  

可以加载到R中的最大DLL数量,例如通过        现在可以通过设置环境来增加dyn.load()        在开始R之前变量R_MAX_NUM_DLLS。

答案 1 :(得分:16)

增加这个数字当然是“可能的”......但也需要花费一些成本 (增加R的固定内存占用量。)

我没有设置这个限制,但我很确定它也意味着提醒useR在她/他的R会话中“清理”一点,即不会不必要地加载包名称空间。我还想象你需要> 100包|在R会话中加载的命名空间。 OTOH,现在有些软件包有很多依赖关系,所以我同意这种情况至少可能比过去更频繁地发生。

真正的解决方案当然是代码改进,从相对较少数量的“DLLinfo”结构(比如32)开始,然后根据需要分配更多批次(大小为32)。

非常欢迎对R源(在https://svn.r-project.org/R/trunk/进行颠覆的开发主干)的补丁!

---- 2017年1月26日补充:与此同时,我们有一个public bug report关于此问题,一个提议的补丁(这还不够好:总是存在操作系统依赖限制打开文件的数量),今天该错误报告已由R核心成员@TomasKalibera关闭,他们实现了新的代码,其中最大加载DLL数设置为

  

pmax(100, pmin(1000, 0.6* OS_dependent_getrlimit_or_equivalent()))

等等Windows和Linux(尚未测试,但“几乎肯定是”macOS),限制应该比以前高很多。

-----更新#2(写于2018年1月5日):
  在17年10月,上面的更改变得更加自动,以下提交源(仅限R的开发版本!)

  

r73545 | kalibera | 2017-10-12 14:41:20

     

增加默认情况下可以加载的DLL数量。如果需要的话,   增加打开文件的软限制。

并在帮助页面?dyn.loadhttps://stat.ethz.ch/R-manual/R-devel/library/base/html/dynload.html)上现在提到了ulimit -n <num_open_files>注意部分接近底部)。

因此,您可以考虑使用R的开发版本,直到4月成为“主流” 或者,您(在终端/ shell中)

  

ulimit -n 2048

然后从该终端启动R. Tomas Kalibera提到这可以在macOS上工作。

答案 2 :(得分:5)

我在bioconductor中的simpleSingleCell库中遇到了这个问题

在macOS上你不能超过256.所以我把我的.Renviron设置在我的家庭目录中 R_MAX_NUM_DLLS = 150

答案 3 :(得分:-2)

这很容易 转到环境变量并编辑

variable_name = R_MAX_NUM_DLL
value = 1000

重新启动R. 对我来说效果很好