【问题标题】:Prevent R from using virtual memory on unix/linux?防止 R 在 unix/linux 上使用虚拟内存?
【发布时间】:2012-05-05 09:42:17
【问题描述】:

短版

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

加长版

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

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

这会导致 R 在尝试分配比可用内存更多的内存时抛出错误并中止。但是,如果我在并行化(通常使用snow 包)时犯了这种错误,ulimit 将不起作用,并且机器无论如何都会崩溃。我猜这是因为snow 将工作人员作为不在 bash 中运行的单独进程启动。如果我尝试在我的~/.Rprofile 中设置ulimit,我只会得到一个错误:

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

有人可以帮我想出一个方法来完成这个吗?

旁道

为什么我不能在bash 中设置虚拟内存为0 的ulimit

$ ulimit -m 33554432 -v 0

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

【问题讨论】:

标签: linux r unix


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的快速回复!我不知道system 启动了一个子进程,但认为它调用了它的父进程。 sysctl 解决方案听起来很有趣,尤其是如果它可以设置为仅限制某些用户或组,所以我会研究一下。
猜你喜欢
  • 2021-06-17
  • 2016-05-12
  • 2017-02-14
  • 2014-09-17
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多