【问题标题】:Error: Maximal number of DLLs reached错误:已达到最大 DLL 数
【发布时间】:2016-05-02 02:26:59
【问题描述】:

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

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

【问题讨论】:

  • 您尝试过使用 Microsoft R 吗?我不确定这是否可行,但它可能是一个可行的替代方案。
  • 我刚刚检查了 Microsoft R 的源代码。我认为他们没有更改“#define MAX_NUM_DLLS 100”代码。还有一些需要编译的包也无法安装。

标签: r dll package


【解决方案1】:

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

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

【讨论】:

  • 要全局设置,应该添加到 Renviron 还是 Renviron.site 中?
  • ?Startup,或者google给出了描述R启动配置的多个参考,例如Understanding R's startup
  • 来自“高效 R 编程”:.Renviron 文件用于存储系统变量。它遵循与 .Rprofile 文件类似的启动例程:R 首先查找全局 .Renviron 文件,然后查找本地版本。 .Renviron 文件的典型用途是指定 R_LIBS 路径
  • 在 Windows 上加载 R 时出现错误是此环境变量设置为大于 1000 的值。
【解决方案2】:

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

我没有设置这个限制,但我很确定这也是提醒用户在她/他的 R 会话中“清理”一点,即不要不必要地加载包命名空间。我还无法想象您需要超过 100 个包 |在 R 会话中加载的命名空间。 OTOH,现在一些包有很多依赖项,所以我同意这至少可能比过去更频繁地意外发生。

真正的解决方案当然是对代码进行改进,从相对较少数量的“DLLinfo”结构(例如 32 个)开始,然后在需要时分配更多批次(例如 32 个)。

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

---- 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 |卡利贝拉 | 2017-10-12 14:41:20

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

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

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

ulimit -n 2048

然后从该终端启动 R。 Tomas Kalibera 提到这一点可以在 macOS 上运行。

【讨论】:

  • R Core 团队是否愿意将 MAX_NUM_DLLS 增加到 200 左右?或者这里有比眼前所见的更多东西吗?我正在研究 R 包 mlr,我们在为所有学习者执行单元测试时遇到了这个问题
  • 是的,还有更多……请参阅 R-devel 邮件列表上的线程,请参阅例如我最近的帖子stat.ethz.ch/pipermail/r-devel/2016-December/073529.html(以及它周围的消息)。我希望我们在 2017 年 4 月的 R 3.4.0 之前有一些东西(如果你愿意使用 R 的开发版本,那么早一点。
  • 这里有同样的问题 - 正在编写一个包含很多依赖项的包,我现在也收到此错误...
  • @MartinMächler:这是后来添加到 R 3.4.0 中的吗?
  • 是的,它已添加到 R 3.4.0 中 --- 但与上面的不太一样。发现/上面仍然“太危险”/在某些情况下不好,即当打开文件的数量有限时(通常在(某些?)Linux(例如我的 Fedora 24 ) 所以 R 3.4.0 现在从环境变量 R_MAX_NUM_DLLS 中获取默认值(在 Linux 上不能大于 1000)。例如在我当前(相当强大的)桌面上:
【解决方案3】:

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

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

【讨论】:

  • MacOS 的实际限制似乎是 153,否则 R 3.4 会抛出致命错误。
【解决方案4】:

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

variable_name = R_MAX_NUM_DLL
value = 1000

重启 R 对我来说效果很好

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多