11

精简版

有没有办法阻止 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

有人可以帮我想办法做到这一点吗?

侧轨

为什么我不能设置一个ulimit0 的虚拟内存bash

$ ulimit -m 33554432 -v 0

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

4

1 回答 1

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. (谷歌关于这些。)

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

于 2012-04-24T18:01:06.890 回答