2011-12-21 11 views
6

大きなファイルと小さなファイルをマージしようとすると壁に当たってしまいました。私はreadmany Rのメモリ管理に関する他の記事を持っており、それを解決する非極端な(64ビットのgo、クラスタへのアップロードなど)方法を見つけることができませんでした。私はbigmemoryパッケージを少し試しましたが、解決策を見つけることができませんでした。私は私が手を差し伸べる前にここで試してみると思った。大きなマージ/メモリ管理

私が実行しているコードは以下のようなものです:

#rm(list=ls()) 
localtempdir<- "F:/Temp/" 
memory.limit(size=4095) 
[1] 4095 
    memory.size(max=TRUE) 
[1] 487.56 
gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 170485 4.6  350000 9.4 350000 9.4 
Vcells 102975 0.8 52633376 401.6 62529185 477.1 

client_daily<-read.csv(paste(localtempdir,"client_daily.csv",sep=""),header=TRUE) 
object.size(client_daily) 
>130MB 

sbp_demos<-read.csv(paste(localtempdir,"sbp_demos",sep="")) 
object.size(demos) 
>0.16MB 
client_daily<-merge(client_daily,sbp_demos,by.x="OBID",by.y="OBID",all.x=TRUE) 
Error: cannot allocate vector of size 5.0 MB 

私が求めていると思います新しいハードウェアを購入する必要ありません。この周りの任意の巧妙な方法がありますか?

  1. より大きなオブジェクトを作成するには、mergeにする必要があります。
  2. 私はその大きなオブジェクトで回帰などをする必要があります。

私はあきらめますか? bigmemoryはこれを解決するのに役立つはずですか?

ご迷惑をおかけして申し訳ございません。

詳細:Rバージョン2.13.1(2011-07-08)プラットフォーム:I386-PC-MINGW32/I386 (32ビット)のIntel 2 Duoプロセッサコア2.33GHz @、3.48ギガバイトRAM

+4

あなたは 'data.table'パッケージを見ましたか?大規模なマージでは*高速*ですが、偶然にも起動時のメモリ効率は向上しますか? – Chase

+0

これはおそらくあなたの問題を解決することはできませんが、ここで試すことができます。どちらのデータセットにも必要のない列がある場合は、データを読み込んだ後で列を削除し、gc()を実行してから再度マージを試みます。もう一つのアイデアは、できるだけメモリを使い果たしてしまうので、できるだけデータを行列に変換することです。 – Rguy

答えて

8

Chaseが既に述べたように、data.tableまたはおそらくsqldfを試すことができます。

インデックスを適切に設定すると、いずれの場合でも、より多くのジュースが得られる可能性があります。 data.tableあなたが希望して

dt1 <- data.table(sbp_demos, key='OBID') 
dt2 <- data.table(client_daily, key='OBID') 

## Do an INNER JOIN-like operation, where non-matching rows are removed 
mi <- dt1[dt2, nomatch=0] 

## Do a RIGHT JOIN(?)-like operation ... all rows in dt2 will be returned. 
## If there is no matching row in dt1, the values in the dt1 columns for 
## the merged row will be NA 
mr <- dt1[dt2] 

あなたがsqldfルートを行く場合は、look at example 4i on its website ...もう一度、あなたは正しくインデックスを使用してください。