在R中高效的内存管理

13

我在我的电脑上拥有6GB 的内存(Windows 7 Pro 64位),在使用R时,我得到

> memory.limit()
6141

当处理大数据时,内存分配错误是很常见的。因此为了让R使用虚拟内存,我使用

> memory.limit(50000)
现在,当我运行我的脚本时,不再出现内存分配错误,但 R 占用了计算机的所有内存,所以在脚本完成之前我无法使用该计算机。我想知道是否有更好的方法让 R 管理机器的内存。我认为它可以做的一件事是,如果它正在使用超过用户指定的物理内存,则使用虚拟内存。是否有这样的选项?
3个回答

11

请看 ff 和 bigmemory 包。它们使用了能够了解 R 对象的函数,将其存储到磁盘上,而不是让操作系统(只知道内存块,但不知道它们表示什么)控制。


5

R不负责管理计算机的内存,这是操作系统的责任。 memory.sizememory.limit在Windows上存在的唯一原因是因为(来自help("Memory-limits")):

 Under Windows, R imposes limits on the total memory allocation
 available to a single session as the OS provides no way to do so:
 see 'memory.size' and 'memory.limit'.

R对象也必须在RAM中占用连续的空间,因此您可能会遇到仅有少量大型对象的内存分配问题。您可以更加谨慎地处理创建的对象数量/大小,并避免使用太多内存。


4
这不是一个解决方案,而是一个建议。尽可能使用内存效率高的对象:例如,使用矩阵而不是数据框。

这里是一个例子:

m = matrix(rnorm(1000), 2, 2)
d = as.data.frame(m)
object.size(m)
232 bytes
object.size(d)
808 bytes

3
这个例子似乎只突出了非常小的固定数据分配差异。把矩阵设为m = matrix(rnorm(1000), 20000, 10),那么对象之间的大小差异变得微不足道。实际上,对于我工作区中的某些随机data.frame进行检查,matrix版本要大2倍。因此,我认为这个建议对手头的问题没有用处。 - eddi
1
不,我不同意。矩阵比数据框更有效率。这也是为什么很多 R 函数在内部将数据框强制转换为矩阵的原因之一。我明确提到我的答案只是建议,如果你想的话可以采用最佳实践。对于你的第二个评论(随机数据框小于矩阵版本),我认为这是错误的。 - agstudy
这是我在工作区中拥有的特定data.frame的情况。 object.size(as.data.frame(rec)):11542192字节object.size(as.matrix(rec)):26516160字节 - eddi
1
这里有一个可重现的例子:d = data.frame(a = 1:100, b = "b") - 尝试检查各种对象的大小。无法以比在data.frame中更高效(无论是对于内存还是速度)地存储例如数字和字符串之类的内容,而不是在matrix中。您的建议仅会为均匀类型的data.frame节省微不足道的内存(大约600字节),并且对其他任何内容都不起作用。 - eddi
@eddi 请尝试阅读这篇文章,以了解矩阵效率与数据框比较的观点。 - agstudy
哦,我明白你的意思了,只是你的观点与手头的问题无关。干杯 :) 编辑:请注意,OP 是关于 内存 效率的。 - eddi

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