0

8 GB 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

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]

これは「ベクトル化」されているため、ラップリーよりもはるかに効率的です。

于 2013-10-07T20:05:27.330 に答える