有没有办法防止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
如果我快速关闭它。
答案 0 :(得分:11)
运行在子进程中执行的system("ulimit")
时。父级不会从父级继承ulimit
。 (这与做system("cd dir")
或system("export ENV_VAR=foo")
。
在启动环境的shell中设置它是正确的方法。该限制在并行情况下不起作用,因为它是每进程限制,而不是全局系统限制。
在Linux上,您可以配置strict(er)overcommit accounting,它试图阻止内核处理无法由物理内存支持的mmap
请求。
这是通过调整sysctl参数vm.overcommit_memory
和vm.overcommit_ratio
来完成的。 (谷歌关于这些。)
这可以成为防止颠簸情况的有效方法。但是权衡的是,当事情表现良好时,你会失去过度使用所带来的好处(将更多/更大的进程塞进内存中)。