0

我有一台 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())

4

2 回答 2

3

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

 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)]
于 2013-10-07T18:45:21.583 回答
2

我认为您正在查找不匹配的 id 的向量ref.table$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 更有效。

于 2013-10-07T20:05:27.330 回答