在Linux下限制R的内存使用

16

我们正在一个Linux群集环境下运行R。当用户无意中使用R处理过程占用了所有内存时,主节点将卡死。是否有一种方法可以在Linux下限制R的内存使用?我不想建议全局ulimit,但这可能是唯一的出路。


1
我之前也遇到过这个问题(链接),可能与你的问题有关。我们最终采取的解决方案是完全禁用机器上的内存过度承诺。这是一个粗糙的解决方案,但运行得很好。 - Backlin
1
如果你碰巧使用RStudio服务器,你可以通过在/etc/rstudio/rserver.conf中添加像rsession-memory-limit-mb = 4000这样的行来设置用户限制。 - GSee
1
这个http://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process有用吗?(即,不是针对R的特定方法,但如果您能想出适用于您的操作系统的通用每进程解决方案,那么您可以为R设置一个强制执行它的别名...似乎这个https://github.com/pshved/timeout会特别有用。 - Ben Bolker
ulimit 在你想要使用所有核心时就无法正常工作了。 - otsaw
2个回答

17

unix::rlimit_as()这个函数,可以使用与shell中ulimit相同的机制为运行中的R进程设置内存限制。但是Windows和macOS不支持。

在我的.Rprofile文件中,我有以下代码:

unix::rlimit_as(1e12, 1e12)

将内存使用限制在约12 GB。

在此之前...

我创建了一个名为 ulimit 的小型 R 包,具有类似的功能。

从 GitHub 安装它,使用以下命令:

devtools::install_github("krlmlr/ulimit")

要将可用于 R 的内存限制为 2000 MiB,请调用:

ulimit::memory_limit(2000)

现在:
> rep(0L, 1e9)
Error: cannot allocate vector of size 3.7 Gb

3
如你在 GitHub 上所说,这个方案只适用于三种操作系统中的两种,而大多数新手使用的是第三种。也许值得在这里的某个地方做一下说明... - Dirk Eddelbuettel
@krlmlr请解释一下,考虑到https://mran.revolutionanalytics.com/已经可用,这个是如何必要的?它在某种程度上是在补充它吗? - SemanticBeeng
@SemanticBeeng:我的程序包是为了防止R占用我笔记本电脑的所有RAM,企业级扩展器(我不熟悉)可能具有略微不同的范围。 - krlmlr
1
有计划将其放在CRAN上吗? - MichaelChirico
1
@MichaelChirico:暂时还没有,计划将其与RAppArmor合并,后者提供了更多的ulimit API,但也有其他缺点。 - krlmlr
显示剩余3条评论

8

内存限制建议使用ulimitlimit

有一个命令行标志:--max-mem-size,可以设置初始限制。用户可以在会话期间使用memory.limit来增加它。


9
谢谢,James。--max-mem-size现在已经从R中删除了,memory.limit只适用于Windows操作系统。ulimit和limit似乎是唯一可行的方法。 - seandavi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接