问题 防止R在unix / linux上使用虚拟内存?


简洁版本

有没有办法阻止R在unix机器上使用任何虚拟内存?无论何时发生,都是因为我搞砸了然后我想中止计算。

更长的版本

我正在与其他几个人共享的强大计算机上处​​理大数据集。有时我会设置需要比可用内存更多RAM的命令,这会导致R开始交换并最终冻结整个机器。通常我可以通过设置一个来解决这个问题 ulimit 在我的 ~/.bashrc

ulimit -m 33554432 -v 33554432  # 32 GB RAM of the total 64 GB

这导致R抛出错误并在尝试分配比可用内存更多的内存时中止。但是,如果我在并行化时(通常使用 snow 包) ulimit 没有任何影响,机器无论如何都会崩溃。我猜那是因为 snow 将工作程序作为不以bash运行的单独进程启动。如果我试着设置 ulimit 在我的 ~/.Rprofile 我刚收到一个错误:

> system("ulimit -m 33554432 -v 33554432")
ulimit: 1: too many arguments

有人可以帮我找到实现这个目标的方法吗?

侧轨道

为什么我不能设置 ulimit 0个虚拟内存 bash

$ ulimit -m 33554432 -v 0

如果我这样做很快就会关闭。


992
2018-04-24 17:48


起源

看到 我对相关问题的回答 对于允许设置的R包 ulimit 对于正在运行的R seion。 - krlmlr


答案:


当你跑步 system("ulimit") 正在子进程中执行。父母不继承 ulimit 来自父母。 (这是有益的 system("cd dir"), 要么 system("export ENV_VAR=foo")

在启动环境的shell中设置它是正确的方法。该限制在并行情况下不起作用,因为它是每进程限制,而不是全局系统限制。

在Linux上,您可以配置严格(呃)过度使用记帐,试图阻止内核处理 mmap 请求无法由物理内存支持。

这是通过调整sysctl参数来完成的 vm.overcommit_memory 和 vm.overcommit_ratio。 (谷歌有关这些。)

这可以是防止颠簸情况的有效方法。但是权衡的是,当事情表现良好时,你会失去过度使用所带来的好处(将更多/更大的进程塞进内存中)。


11
2018-04-24 18:01



感谢您的快速回复!我不知道 system 开始了一个子进程,但认为它叫它的父进程。 sysctl解决方案听起来很有趣,特别是如果它可以设置为仅限制某些用户或组,所以我会调查它。 - Backlin