4

リストと「サブリスト」をRで保存しているときに、現在奇妙な問題に直面しています。タイトルは明示的ではないかもしれませんが、私を悩ませているのは次のとおりです。

いくつかのデータが与えられた場合 (ここではデータは完全に人為的ですが、問題はモデルの関連性ではありません):

set.seed(1)
a0 = rnorm(10000,10,2)
b1 = rnorm(10000,10,2)
b2 = rnorm(10000,10,2)
b3 = rnorm(10000,10,2)
data = data.frame(a0,b1,b2,b3)

そして、複雑なオブジェクト(オブジェクトとしましょうlm())のリストを返す関数:

test = function(k){
    tt = vector('list',k)
    for(i in 1:k) tt[[i]] = lm(a0~b1+b2+b3,data = data)
    tt
}

テスト関数はオブジェクトのリストを返しlm()ます。このオブジェクトのサイズを見てみましょう:

ok = test(2)
object.size(ok)
> object.size(ok)
4019336 bytes 

ok2関数内ではなく、まったく同じオブジェクトであるを作成しましょう。

ok2 = vector('list',2)
ok2[[1]] = lm(a0~b1+b2+b3,data = data)
ok2[[2]] = lm(a0~b1+b2+b3,data = data)

...そして彼のサイズを確認してください:

> object.size(ok2)
4019336 bytes

ここにあり、okまったくok2同じであるため、R.問題がわかりました。これらのオブジェクトをハード ドライブに R オブジェクトとして保存すると (save()またはを使用saveRDS()) :

save(ok,file='ok.RData')
save(ok2,file='ok2.RData')

ハード ドライブ上のサイズはそれぞれ :3 366 005 bytes1 678 851 bytesです。 は、まったく同じなokのに 2 倍の大きさです。ok2

さらに奇妙なことに、オブジェクトの「サブリスト」を保存するとok[[1]]、 and ok2[[1]](オブジェクトは再び完全に同一です) としましょう:

a = ok[[1]]
a2 = ok2[[1]]
save(a,file='console/a.RData')
save(a2,file='console/a2.RData')

それぞれのハード ドライブ上のサイズ:2 523 284 bytes838 977 bytes.

2 つのこと: のサイズがハード ドライブaのサイズと異なるのはなぜですか? のサイズがハード ドライブ上の のサイズと異なるa2のはなぜですか? そして、 HDでは サイズが正確に半分になるのはなぜですか?okok2aok2 523 284 bytesok3 366 005 bytes

何か不足していますか?

ps : R 2.15.1、2.15.2、2.15.3、3.0.0、および debian と R 2.15.1、R 2.15.2 を使用して、Windows 7 32 ビットでこのテストを実行しました。私は毎回この問題を抱えています。

編集

@ user1609452へのthx、これはうまくいっているように見える小さなトリックです:

test2 = function(k){

    tt = vector('list',k)
    for(i in 1:k){
        tt[[i]] = lm(a0~b1+b2+b3,data = data)
        attr(tt[[i]]$terms,".Environment") = .GlobalEnv
        attr(attr(tt[[i]]$model,"terms"),".Environment") = .GlobalEnv
    }
    tt
}

数式オブジェクトには、独自の環境とその中に多くのものがあります。NULLそれを .GlobalEnv に入れると、うまくいっているようです。predict.lm() などの関数は引き続き機能し、保存されたオブジェクトは HD 上で適切なサイズになります。理由はわかりませんが。

4

1 に答える 1

5

見る

> attr(ok[[1]]$terms,".Environment")
<environment: 0x9bcf3f8>
> attr(ok2[[1]]$terms,".Environment")
<environment: R_GlobalEnv>

また

> ls(envir = attr(ok[[1]]$terms,".Environment"))
[1] "i"  "k"  "tt"

ok関数の環境をドラッグすることも同様です。

また読む?object.size

 The calculation is of the size of the object, and excludes the
 space needed to store its name in the symbol table.

 Associated space (e.g. the environment of a function and what the
 pointer in a ‘EXTPTRSXP’ points to) is not included in the
 calculation.

たとえば、 atest2と an を定義します。ok3

test2 = function(k){
    tt = vector('list',k)
    for(i in 1:k) tt[[i]] = lm(a0~b1+b2+b3,data = data)
    rr = tt
    tt
}

ok3 <- test2(2)
save(ok3, 'ok3.RdData')

> file.info('ok3.RData')$size
[1] 5043933
> file.info('ok.RData')$size
[1] 3366005
> file.info('ok2.RData')$size
[1] 1678851

> ls(envir = attr(ok3[[1]]$terms,".Environment"))
[1] "i"  "k"  "rr" "tt"

余分なものがあるため、おおよそok2倍の大きさで、3倍の大きさです。ok2ttok3ttrr

> c(object.size(ok),object.size(ok2),object.size(ok3))
[1] 4019336 4019336 4019336

ここに関連する議論があります

于 2013-04-30T09:38:58.547 に答える