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

时间:2012-04-24 17:48:41

标签: linux r unix

短版

有没有办法防止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中设置bash 0个虚拟内存?

$ ulimit -m 33554432 -v 0

如果我快速关闭它。

1 个答案:

答案 0 :(得分:11)

运行在子进程中执行的system("ulimit")时。父级不会从父级继承ulimit。 (这与做system("cd dir")system("export ENV_VAR=foo")

有关

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

在Linux上,您可以配置strict(er)overcommit accounting,它试​​图阻止内核处理无法由物理内存支持的mmap请求。

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

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