如何在R会话中手动分配内存?

时间:2017-07-27 19:30:29

标签: r

是否可以在R会话中手动分配内存?我在共享的Windows服务器上工作,有时会遇到内存问题。使用Stata时,可以使用以下方式为该会话分配内存:

set min_memory 50g

R中有类似的东西吗?

编辑以提供更好的上下文:

为什么我需要这样的命令?

假设我们有一个脚本可以将RAM使用率提高到20Gb,但大多数时候只使用5Gb。 R处理它的自然方式是仅在需要时分配内存(在大多数情况下似乎是合理的)。但是想象一下,你需要在一个共享服务器上运行这个程序(比那个RAM多得多),由于其他用户的需要,它可以在程序达到峰值时没有20Gb的可用内存。

在那种情况下,我认为通过在启动程序时为此R会话(在Stata中可能)分配20Gb之前避免这种风险会很好,然后避免在运行中浪费资源甚至没有完成。

1 个答案:

答案 0 :(得分:1)

TL; DR:我做了很多挖掘工作,找不到任何暗示“最小内存大小”设置的内容。

如果我正确理解了您的问题,您希望R为会话预先请求非常大的(20 Gb)内存量,然后自行管理此内存,以确保在需要时可用资源。从我能够收集的信息来看,这是不可能的,它与R的设计师采用的策略大致相反。

正如您所说,R通过以下方式分配和管理内存:

  1. 设置会话的最大限制
  2. 在创建对象时分配
  3. 在某些限制内,一旦对象完成就回收内存
  4. 对于小分配,我认为第3步是使用C函数alloca()完成的,它使用堆栈;对于较大的函数,它使用malloc()在堆上分配。这个有效意味着什么是R可以请求一小段内存(128字节,根据Advanced R)来管理自己来得很快的小对象,但对于较大的对象它让操作系统处理它。

    我从源代码和R internals的评论中看到的所有焦点都表明,开发团队专注于编写只能保存当前计算所需内存量的软件,然后立即释放它: / p>

      

    我们希望将堆大小设置为适合当前的级别   计算。本机制仅使用当前的大小   live heap提供有关当前需求的信息;自从   当前的实时堆大小可以是非常不稳定的调整机制   只是逐步调整。更复杂的策略会   使用更多的实时堆历史记录(source中的第314-320行)

    话虽如此,可能会有一个包或扩展重写了一些我不知道的核心功能 - 尽管这似乎与R写的方式有很大的不同,但它可能是一个项目的fork而不是包。如果你不想自己做这件事,我会建议一个更平凡的解决方案,比如在一夜之间运行你的程序以避免资源竞争。或者逐步处理您的数据,或者查看数据库或bigmemory包之类的内容是否可以帮助您。祝你好运!