2016-10-12 18 views
1

私はこの1つを完全に失っています。私は、R(48000 * 19)の私のデータフレームのために、大量ではあるが不合理ではないマトリックスを持っています。私はそれを取得し、差動効果の斜面を調査するために)(sm.ancovaを使用しようとしたが、13ギガバイトは、Rに割り当てられたメモリを酷使Rで奇妙なリストサイズ、説明?

error: cannot allocate vector of size 13.1GB 

を得ています。しかし...何?私が読み込んだCSVファイル全体はわずか24,000kbでした。なぜこれらの単一のベクトルがRで非常に大きいのですか?

私が使用しているANCOVAコードは次のとおりです。

data1<-read.csv("data.csv") 
attach(data1) 
sm.ancova(s,dt,dip,model="none") 

はそれに少しでみると、私が使用:すべては同じエラーを与えた
diag(s) 
length(s) 
diag(dt) 
length(dt) 
diag(dip)  
length(dip) 

。それらの長さはすべて48000です。

説明が役立ちます。修正はより良いでしょう:)

ありがとうございます!この問題を再現

ダミーデータリンクはで見つけることができます:https://www.dropbox.com/s/dxxofb3o620yaw3/stackexample.csv?dl=0

+1

可能なdupe:[Rメモリ管理/サイズnのベクトルを割り当てることができません] http://stackoverflow.com/q/5171593/903061) – Gregor

+2

'sm.ancova'は大きなサイズのオブジェクトを割り当てようとしています。パッケージの作者によって書かれたコードは、できるだけ効率的なメモリではありません。 – Vlo

+0

グレゴール:それほどではない、正当に大きすぎるデータの問題を解決しようとしている。私はなぜ私のベクトルが(元のファイルよりも大きさの大きさが)非常に大きくなっているのか、それを防ぐ方法を理解しようとしています。同様ですが少し違う – Jesse001

答えて

4

データを取得する:あなたがdiag()にベクトルを与える場合

## CSV file is 10M on disk, so it's worth using a faster method 
## than read.csv() to import ... 
data1 <- data.table::fread("stackexample.csv",data.table=FALSE) 
dd <- data1[,c("s","dt","dip")] 

、それで対角行列を作ってみるために起こっています対角線上のベクトル。あなたが私たちに与えたデータセットの例は96,000行であるため、diag()はどの要素にも適用され、96,000 x 96,000の行列を構築しようとします。 1000x1000の行列は

format(object.size(diag(1000)),"Mb") ## 7.6 Mb 

です。したがって、ここで作成しようとしている行列は96^2 * 7.6/1024 = 68Gbになります。

A 24Kx24K行列は16倍小さいだろうが、それでも約4 GBの...

それは大きな対角行列を構築するためにスパース行列を使用することが可能です:

より一般的に
library(Matrix) 
object.size(Diagonal(x=1:96000)) 
## 769168 bytes 

すべての解析プログラムが計算効率(速度またはメモリ)を念頭に置いて書かれているわけではありません。この方法が基づいている論文(?sm.ancova)は、2万4000の観測データが巨大なデータセットを構成していた1990年代後半に書かれたものです...

関連する問題