R stats - 分配大矩阵/ Linux时的内存问题

时间:2011-01-16 20:25:05

标签: linux r memory-management statistics

我已经阅读了几个关于R中内存问题的线索,我似乎无法找到解决问题的方法。

我在大数据集的几个子集上运行了一种LASSO回归。对于某些子集,它运行良好,对于一些较大的子集,它不起作用,类型“无法分配大小为1.6Gb的向量”的错误。错误发生在代码的这一行:

example <- cv.glmnet(x=bigmatrix, y=price, nfolds=3)

它还取决于“bigmatrix”中包含的变量数量。

我试用了R和R64用于Mac和R用于PC但是最近在Linux上使用了更快的虚拟机,我认为我会避免任何内存问题。它更好但仍有一些限制,即使memory.limit表示“Inf”。

无论如何要做到这一点,还是我必须在矩阵中剪切一些变量或者采用更小的数据子集?

我已经读过R正在寻找一些连续的内存,也许我应该预先分配矩阵?有什么想法吗?

3 个答案:

答案 0 :(得分:8)

让我稍微谈谈@richardh说的话。您使用R加载的所有数据都会占用RAM。因此,您加载主数据并使用一些RAM。然后,您将数据子集化,以便子集使用较小的块。然后回归算法需要一个比你的子集大的块,因为它做了一些操作和旋转。有时我可以通过执行以下操作来更好地使用RAM:

  1. 使用save()
  2. 将初始数据集保存到磁盘
  3. 获取数据的子集
  4. rm()初始数据集,因此它不再在内存中
  5. 对子集进行分析
  6. 保存分析结果
  7. 完全转储内存中的所有项目:rm(list = ls())
  8. 使用load()
  9. 将步骤1中的初始数据集加载回RAM
  10. 根据需要循环步骤2-7
  11. 小心步骤6并尽量不要射击。在R内存中转储一切。如果它没有被保存,它就会消失。一个更微妙的方法是删除你确定不需要的大对象,而不是删除rm(list = ls())。

    如果您仍需要更多内存,则可能需要在亚马逊云中运行分析。他们的高内存四倍超大型实例拥有超过68GB的RAM。有时当我遇到内存限制时,我发现最简单的事情就是去云端,在那里我可以像我想要的那样邋with RAM。

    Jeremy Anglim有一个很好的blog post,其中包含一些关于R中内存管理的提示。在那篇博文中,Jeremy链接到this previous StackOverflow question,我觉得这很有帮助。

答案 1 :(得分:2)

我不认为这与连续内存有关,但只是R默认只在RAM中工作(即无法写入缓存)。 Farnsworth's guide to econometrics in R提到包filehash以启用写入磁盘,但我没有任何使用它的经验。

您最好的选择是使用较小的子集,通过删除rm不需要的变量来手动管理内存(即运行回归,存储结果,删除旧矩阵,加载新矩阵,重复) ,和/或获得更多的RAM。 HTH。

答案 2 :(得分:0)

试试bigmemory package。这是非常容易使用。我们的想法是将数据存储在HDD中的文件中,然后在R中创建一个对象作为此文件的引用。我测试了这个并且效果很好。

还有一些替代品,比如“ff”。有关详细信息,请参阅CRAN Task View: High-Performance and Parallel Computing with R