尽管有足够的 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())
【问题讨论】:
仅仅因为你做了gc
和rm
并不能保证你的记忆会被“压缩”。您需要连续的内存块,并且您之前的活动完全有可能使您的内存碎片化。此外,您有系统和其他应用程序竞争内存。关闭。在没有其他应用程序的情况下重新启动。只做创建这个对象所需的编码,你不会有困难。 (这肯定是一个重复的问题,所以下次发帖前先搜索一下。)
请注意,该值是一个额外的 41.8kb 块。无论您在做什么,都会耗尽所有 RAM,而 R 无法获得所需大小的另一块来完成操作。
笨重?是的。当您像resid <<- c(resid, firm.industry)
一样增长对象时,R 必须在每次添加新元素时复制整个向量。而<<-
的使用通常是不受欢迎的。我只是猜测,但您可能只需使用 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 <- c(resid, firm.industry)
引起的。我必须这样做的原因是创建一个“结果”向量 (resid
),其中列出了 new.id
中每个 ID 的相应行业。 (换句话说,resid
和 new.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 未加载到内存中