是否可以在R会话中手动分配内存?我在共享的Windows服务器上工作,有时会遇到内存问题。使用Stata时,可以使用以下方式为该会话分配内存:
set min_memory 50g
R中有类似的东西吗?
为什么我需要这样的命令?
假设我们有一个脚本可以将RAM使用率提高到20Gb,但大多数时候只使用5Gb。 R处理它的自然方式是仅在需要时分配内存(在大多数情况下似乎是合理的)。但是想象一下,你需要在一个共享服务器上运行这个程序(比那个RAM多得多),由于其他用户的需要,它可以在程序达到峰值时没有20Gb的可用内存。
在那种情况下,我认为通过在启动程序时为此R会话(在Stata中可能)分配20Gb之前避免这种风险会很好,然后避免在运行中浪费资源甚至没有完成。
答案 0 :(得分:1)
TL; DR:我做了很多挖掘工作,找不到任何暗示“最小内存大小”设置的内容。
如果我正确理解了您的问题,您希望R为会话预先请求非常大的(20 Gb)内存量,然后自行管理此内存,以确保在需要时可用资源。从我能够收集的信息来看,这是不可能的,它与R的设计师采用的策略大致相反。
正如您所说,R通过以下方式分配和管理内存:
对于小分配,我认为第3步是使用C函数alloca()
完成的,它使用堆栈;对于较大的函数,它使用malloc()
在堆上分配。这个有效意味着什么是R可以请求一小段内存(128字节,根据Advanced R)来管理自己来得很快的小对象,但对于较大的对象它让操作系统处理它。
我从源代码和R internals的评论中看到的所有焦点都表明,开发团队专注于编写只能保存当前计算所需内存量的软件,然后立即释放它: / p>
我们希望将堆大小设置为适合当前的级别 计算。本机制仅使用当前的大小 live heap提供有关当前需求的信息;自从 当前的实时堆大小可以是非常不稳定的调整机制 只是逐步调整。更复杂的策略会 使用更多的实时堆历史记录(source中的第314-320行)
话虽如此,可能会有一个包或扩展重写了一些我不知道的核心功能 - 尽管这似乎与R写的方式有很大的不同,但它可能是一个项目的fork而不是包。如果你不想自己做这件事,我会建议一个更平凡的解决方案,比如在一夜之间运行你的程序以避免资源竞争。或者逐步处理您的数据,或者查看数据库或bigmemory
包之类的内容是否可以帮助您。祝你好运!