Error: Maximal number of DLLs reached

Error: Maximal number of DLLs reached

我正在编写一个依赖于许多其他包的 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...

此 post Exceeded maximum number of DLLs in R 指出问题出在基本 R 代码的 Rdynload.c 上: #define MAX_NUM_DLLS 100

除了从源代码修改和构建之外,还有什么方法可以绕过这个问题吗?

增加这个数字当然是"possible"...但是也有点成本 (添加到 R 的固定内存占用)。

我没有设置那个限制,但我很确定它也意味着提醒用户在她/他的 R 会话中 "clean up" 一点,即不要加载不必要的包命名空间。我还无法想象您需要 > 100 个包裹 |在您的 R 会话中加载的命名空间。 OTOH,现在有些包有很多依赖关系,所以我同意这至少可能比过去更频繁地发生。

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

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

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

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

等等 Windows 和 Linux(尚未测试,但 "almost surely" macOS),限制应该比以前高很多。

----- 更新 #2(2018 年 1 月 5 日编写):
在 17 年 10 月,通过以下对源代码的提交(仅限 R 的开发版本!)

,上述更改变得更加自动化

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

Increase the number of DLLs that can be loaded by default. If needed, increase the soft limit on open files.

并且在帮助页面 ?dyn.load (https://stat.ethz.ch/R-manual/R-devel/library/base/html/dynload.html) 上现在提到了 ulimit -n <num_open_files>(靠近底部的 部分)。

所以您可以考虑使用 R 的开发版本,直到它在 4 月份变成 "main stream"。
或者,您可以(在终端/shell)

ulimit -n 2048

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

上工作

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

The maximum number of DLLs that can be loaded into R e.g. via dyn.load() can now be increased by setting the environment variable R_MAX_NUM_DLLS before starting R.

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

在 macOS 上你不能超过 256。所以我在我的主目录中设置了我的 .Renviron R_MAX_NUM_DLLS=150

很简单 转到环境变量并编辑

variable_name = R_MAX_NUM_DLL
value = 1000

重启R 对我来说效果很好