R中的GC和内存限制问题

5

我正在处理一些相对较大的数据,并遇到了一些内存问题。这是在Linux上发生的。尽管系统内存远远超过我的数据量,但问题仍然出现在如何管理瞬态分配。

当我运行gc()时,会得到以下列表

           used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells   2147186  114.7    3215540  171.8   2945794  157.4
Vcells 251427223 1918.3  592488509 4520.4 592482377 4520.3

尽管如此,R似乎在常驻内存中分配了4GB,而在交换空间中分配了2GB。我认为这是操作系统分配的内存,R的内存管理系统将根据需要进行分配和GC。但是,假设我不想让R占用超过4GB,以防止交换空间抖动。我可以使用ulimit限制,但那样它只会崩溃,而不是在缩小空间并更频繁进行GC的情况下工作。有没有办法指定gc触发器的任意最大值,并确保R永远不会超过os分配的内存?还是我可以做些其他事情来管理内存使用情况?
1个回答

3
简而言之:不行。我发现你无法对内存管理和gc()进行微观管理。
另一方面,你可以尝试将数据保存在内存中,但是“在”R之外。 bigmemory使这变得相当容易。当然,使用64位版本的R和充足的RAM也可能解决问题。

bigmemory 会将东西保存在磁盘上,是吗? - Shane
不,你可能在想ff的作用。 - Dirk Eddelbuettel
好的,很高兴澄清这一点。文档中说bigmemory“可能使用内存映射文件”。不确定它何时或如何相关。我从未深入研究过bigmemory的内部,但看起来它使用了Boost.Interprocess。 - Shane
如果您指示它这样做,它可以将内存映射到文件。默认情况下,它只使用RAM。嘿,Jay和Mike是您RUG的本地人,那我为什么要解释这个呢?;-) - Dirk Eddelbuettel
我知道...Jay 确实 解释过,但我很迟钝。 - Shane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接