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

7

我已经阅读了几篇关于R语言内存问题的帖子,但似乎找不到解决我的问题的方法。

我正在对一个大数据集的多个子集进行类似LASSO回归的分析。对于某些子集,它可以正常运行,但对于一些更大的子集,会出现“无法分配大小为1.6Gb的向量”的错误。错误发生在以下代码行:

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

这也取决于“bigmatrix”中包含的变量数量。
我在Mac上尝试了R和R64,也在PC上尝试了R,但最近转到更快的Linux虚拟机上以避免任何内存问题。虽然memory.limit指示“Inf”,但情况有所改善,仍存在一些限制。
有没有办法让这个工作,或者我必须削减矩阵中的几个变量或取一个更小的数据子集?
我已经看过R正在寻找一些连续的内存位,也许我应该预先分配矩阵?有什么想法吗?

1
具有64位扁平地址空间,查找连续地址空间将不成问题。 - David Heffernan
3个回答

8
让我稍微补充一下@richardh所说的。你用R加载的所有数据都会占用RAM。因此,你加载主要数据时它会使用一些RAM。然后你对数据进行子集化,所以子集使用较小的内存块。然后回归算法需要一个比你的子集更大的内存块,因为它执行一些操作和旋转。有时我能够通过以下方式更好地使用RAM:

  1. 使用save()将初始数据集保存到磁盘
  2. 获取数据的子集
  3. 使用rm()删除初始数据集,以便它不再存储在内存中
  4. 对子集进行分析
  5. 保存分析结果
  6. 完全清除内存中的所有项目:rm(list=ls())
  7. 使用load()将步骤1中的初始数据集重新加载到RAM中
  8. 根据需要循环执行步骤2-7

注意第6步并尽量避免出现问题。这将清除R内存中的所有内容。如果没有保存,它将消失。更微妙的方法是删除您确定不需要的大对象,而不执行rm(list=ls())。

如果你仍需要更多的RAM,你可能希望在亚马逊云上运行分析。他们的高内存四倍超大实例具有超过68GB的RAM。有时当我遇到内存限制时,我发现最简单的方法就是去云端,这样我可以随心所欲地使用RAM。
Jeremy Anglim有一篇关于R内存管理的好博客文章blog post。在那篇博客文章中,Jeremy链接了this previous StackOverflow question,我觉得很有用。

@JD -- 说得好!我正在(慢慢地)学习方法。之前的SO问题也找得不错。 - Richard Herron
你的答案很好。我只是加了一些额外的内容,因为我怀疑原帖可能没有完全理解你的意思。 - JD Long

2
我认为这与连续内存无关,而只是因为 R 默认仅在 RAM 中工作(即不能写入缓存)。Farnsworth's guide to econometrics in R提到了filehash包以启用写入磁盘的功能,但我没有任何使用经验。
你最好的选择可能是使用较小的子集,通过使用rm手动管理内存(即运行回归,存储结果,删除旧矩阵,加载新矩阵,重复),和/或获取更多 RAM。希望对你有所帮助。

1
缺乏RAM通常不会导致内存不足错误。系统将使用分页来处理物理RAM不足的情况。您可能会看到抖动,但为什么会出现分配失败呢? - David Heffernan
@davide,你有使用R的经验吗?还是你是基于其他软件的经验在说话?如果R运行时内存不足,它无疑会失败。 - JD Long
@JD 分页怎么样?R是否明确禁用磁盘分页?! - David Heffernan
我的 R 安装经常超过 24GB 的内存并且需要使用分页技术,所以说 R 不允许分页的说法在至少某个操作系统上是错误的。 - IRTFM
@all - 我做了一些调查,但仍然感到困惑。我阅读的指南(Burn's _R Inferno_、R管理员/安装指南和help('Memory-limits'))都说64位R可以在“虚拟内存”中工作,这意味着R应该能够写入页面文件。但是我不能;我仍然遇到“无法分配”大于8 GB的错误。我使用的是Windows 7 64位笔记本电脑,有8 GB RAM(我认为默认情况下有8 GB的页面文件)。我错过了什么?我能告诉R在Win/Mac/Linux中使用页面文件吗?这值得一个新问题吗?我还使用一台4 GB的Mac,所以这可能会很方便。谢谢! - Richard Herron
显示剩余4条评论

0

尝试使用bigmemory包。它非常易于使用。其思想是将数据存储在硬盘上的文件中,并在R中创建一个对象作为对该文件的引用。我已经测试过这个,它运行得非常好。

还有一些替代方案,比如"ff"。请参阅CRAN任务视图:使用R进行高性能和并行计算以获取更多信息。


1
我刚刚尝试了bigmemory包和ff包。ff包似乎更好。这太棒了!;-) - Stéphane Laurent
从 SQL 服务器加载数据怎么样? - Areza

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