2012-04-10 14 views
2

私は4GBのRAMを持っており、LinuxではRのメモリに147.6MBのメモリが残っているというエラーメッセージが表示されています。Error: cannot allocate vector of size 147.6 Mbdata.framesをマージするとメモリ不足エラーになる

どうすれば診断できますか?

IDs <- read.csv('Set1.csv') # 2 MB 
Set2 <- read.csv('Set2.csv') # 240 MB 
data <- merge(IDs, Set2, by='MemberID') 
rm(IDs)      # Remove junk! 
rm(Set2)      # Remove junk! 
gc() 
print('First merge complete') 

Set3 <- read.csv('Set3.csv') # 25 MB 
data <- merge(data, Set3, by='MemberID') 
rm(Set3)      # Remove junk! 
gc() 
print('Second merge complete') 

実行は最初のprint文の後に一時的に停止させます。

は、ここに私のコードです。余分なメモリ使用量がどこから来ているのか分かりません。 Rのmemory()のドキュメントを見てみると、連続したメモリの問題のようですね。 UbuntuのRでこれを解決する方法はありますか?

ここでも同様の質問をしている他の人も見ていますが、提案された解決策はWindows固有のものでした。

EDIT 1

いくつかのコメントは以下のコメントに対処する:オブジェクトはCSVから読み込まれてからあまりにも多くのサイズを変更しているよう

> print(object.size(IDs), units="Mb") 
1.3 Mb 
> print(object.size(Set2), units="Mb") 
142.6 Mb 
> print(object.size(Set3), units="Mb") 
12.5 Mb 

だから、それは見ていません。私は

EDIT私はdata.table()を使用し、同じエラーを持って自分のコードを更新した2

... data.table()と残りの上にチェックします。これはおそらくそれが私のマシンにとって何となく特別なことを心配していますか?これは関係するファイルのサイズにとって非常に奇妙なようです。 Error: cannot allocate vector of size 147.6 Mb

IDs <- as.data.table(read.csv('Set1.csv')) # 2 MB 
Set2 <- as.data.table(read.csv('Set2.csv')) # 240 MB 
data <- merge(IDs, Set2, by='MemberID') 
rm(IDs)      # Remove junk! 
rm(Set2)      # Remove junk! 
gc() 
print('First merge complete') 

Set3 <- as.data.table(read.csv('Set3.csv')) # 25 MB 
data <- merge(data, Set3, by='MemberID') 
rm(Set3)      # Remove junk! 
gc() 
print('Second merge complete') 

EDIT私のデータで確認3

、私はこの問題は、ここにも思います。 Set3.csvには一般的なフィールド名がいくつかあったので、それはnx nのジョイントなどをしていたと思います。

+3

あなたは[The R Inferno]の第2サークル(https://www.google.com/url?q=http://www.burns-stat.com/pages/)のどこかにいると思います。家庭教師/ R_inferno.pdf&sa = U&ei = gr-ET_f2Ms_TiAKs-fH1BA&ved = 0CBAQFjAA&usg = AFQjCNFYCWUrzMj_7SOwr-EJ9Gu34VOl_w)。Mergeは非常にメモリを消費しますので、 'object.size'を見ると、Rに読み込んだらcsvファイルはそれよりもかなり大きくなっていると思います。 – Justin

+0

' data.table() '大規模なデータオブジェクトをマージするために、メモリ管理と操作の両方の面で優れています。 – Chase

+0

ちょっと確認するだけで、新鮮なRセッションに合っていますか? – jimmyb

答えて

0

@Chaseとしてdata.table()に切り替えると、上記のコメントに示唆されています。使用済みのオブジェクトを削除すると、私は最初のマージを処理することができます。それは後で、問題を引き起こしていたマージが、非固有キーを持つ2番目のデータセットのために私が期待していなかったどこかのデカルト結合を実際に行っていたことが分かりました。

一時的にデータをサブセット化することでこれを回避しましたが、後でモデルフィットを予測に適用しようとすると、同様のエラーが発生しました。

ストーリーの道徳は、上記の@Justinによって示唆されているように、R関数が入ってくるベクトルそのもののサイズよりも多くのメモリを使用するということです。object.sizeで測定しました。処理操作中にRAMを使い果たす機能の場合も同様です。

0

私は非常に似た問題を抱えていました。私の問題は、両方のデータフレームの「by」列にNAを導入したことでした。

最後に非常に大きなデータフレームの原因となったものです。 NAで行を修正または削除すると、の問題が解決しました。