尽管有足够的 RAM,但内存错误

Posted

技术标签:

【中文标题】尽管有足够的 RAM,但内存错误【英文标题】:Memory error despite having ample RAM 【发布时间】:2013-10-07 17:49:31 【问题描述】:

我有一台具有 8GB RAM 的 64 位 Windows 7 机器。 memory.limit() 显示 8135。我遇到了内存问题,即使我正在尝试做的事情看起来一点也不奇怪(与 SO 上的其他与内存相关的问题相比)。

基本上,我将公司的 ID 与他们的行业相匹配。 ref.table 是我存储ID和行业以供参考的数据框。

matchid <- function(id) 
  firm.industry <- ref.table$industry[ref.table$id==id]
  firm.industry <- as.character(firm.industry[1]) # Sometimes same ID has multiple industries. I just pick one.
  resid <<- c(resid, firm.industry)

resid <- c()
invisible( lapply(unmatched.id, matchid) ) # unmatched.id is the vector of firms' ID to be matched

unmatched.id 向量的长度约为 60,000 个元素。我仍然收到错误“无法分配 41.8kb 大小的向量”(只有 41.8kb!)Windows 任务管理器始终显示 RAM 使用情况。

是不是因为我的功能太笨拙了?我无法想象是矢量大小导致了问题。

(PS:我经常做 gc() 和 rm())

【问题讨论】:

仅仅因为你做了gcrm 并不能保证你的记忆会被“压缩”。您需要连续的内存块,并且您之前的活动完全有可能使您的内存碎片化。此外,您有系统和其他应用程序竞争内存。关闭。在没有其他应用程序的情况下重新启动。只做创建这个对象所需的编码,你不会有困难。 (这肯定是一个重复的问题,所以下次发帖前先搜索一下。) 请注意,该值是一个额外的 41.8kb 块。无论您在做什么,都会耗尽所有 RAM,而 R 无法获得所需大小的另一块来完成操作。 笨重?是的。当您像resid &lt;&lt;- c(resid, firm.industry) 一样增长对象时,R 必须在每次添加新元素时复制整个向量。而&lt;&lt;- 的使用通常是不受欢迎的。我只是猜测,但您可能只需使用 unique(ref.table$industry[ref.table$id %in% unmatched.id]) 就可以完成所有这些操作。 @DWin 我知道之前有人问过这个连续阻塞问题,但我不确定我的代码的哪一部分导致它。我将遵循 joran 的建议并修复我的代码的那部分。 仔细看,你的resid有指数增长 【参考方案1】:

尝试以下操作,看看它是否不再给您带来内存抱怨

 lapply(unmatched.id, function(id) as.character(ref.table$industry[ref.table$id==id]))

如果上述方法有效,则将其包装在unlist( .., use.names=FALSE)

或尝试使用 data.table

library(data.table)
ref.table <- data.table(ref.table, key="id") 
ref.table[.(unmatched.id), as.character(industry)]

【讨论】:

您的lapply 代码工作正常。我认为内存问题是由我的resid &lt;- c(resid, firm.industry) 引起的。我必须这样做的原因是创建一个“结果”向量 (resid),其中列出了 new.id 中每个 ID 的相应行业。 (换句话说,residnew.id 列出了相同公司的行业和 ID)。在其他语言中,我可以使用 for 循环,遍历 new.id 的每个元素并更改 resid 中的相应元素。但是,在 R 中使用 lapply 时,lapply 中的函数会在每个元素之后返回。这就是为什么我不得不修改一个全局变量来创建resid 我不确定事情是否按照您理解的方式工作;)无论如何,请尝试第二种方法 你能解释一下我的误解吗?目前,我设法找到了一个解决方案(如下),但出于学习的目的,我非常感谢您的 cmets。只要你有时间! 我不确定我是否完全理解你的看法,但是:" (In other words, resid and new.id list industry and ID of the same firms)"lapply 是如何实现这个 not 的?【参考方案2】:

我认为您正在ref.table$id 中查找不匹配 id 的向量,并找到相应的索引

## first match, one for each unmatched.id, NA if no match
idx <- match(unmatched.id, ref.table$id)
## matching industries
resid <- ref.table$industry[idx]

这是“矢量化”的,比 lapply 高效得多。

【讨论】:

以上是关于尽管有足够的 RAM,但内存错误的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB、NUMA 硬件、页面错误但有足够的 RAM 用于工作集、触摸命令或 vmtouch/dd 未加载到内存中

没有足够的java内存是啥意思,怎么解决

尽管有足够的 RAM,但 numpy.append 中的 MemoryError

在“行走”大图时最小化页面错误(和TLB错误)

python内存错误(有足够的可用内存)

分析大型 Java 堆转储 - 内存错误