2016-08-04 4 views
3

私はdata.frameの最初の要素へのアクセス時間に問題があります。アクセス時間はdata.frameのサイズに依存するようです。誰もこの依存関係を排除する方法を知っていますか?data.frameの最初の要素のアクセス時間がその次元に依存するのはなぜですか?

これは私が実行したコード例です。これは、data.frameの最初の要素を設定するのに必要な時間を節約するために必要な時間を節約します。を1000のステップで割り当て、最初の要素を0に設定します。短いdata.framesでは、アクセス時間は測定可能性をはるかに下回り、長いアレイでは数秒に上がります。

tme <- (1:500) 
for (j in 1:500){ 
    i <- j*1000 
    vec <- (1:(i*1000)) 
    print(i) 
    now <- Sys.time() 
    vec[1] <- 0 
    tme[j] <- Sys.time()-now 
} 
tme_vec_first <- tme 
+3

ホ7とMS Rオープン3.2.5を使用してRstudioとRguiの両方で観察されていること?私はこのコードの近くのどこにでもdata.frameを見ません。 – Frank

答えて

6

時間の増加はアクセス時間に関連しているとは思われませんが、コピーを作成することによるものです。これらの割り当てのそれぞれは、ベクターのコピーを作ることを含む。これはtracememでテストできます。

# initialize vector (10 zeros) 
tracemem({vec <- integer(10)}) 

[1] "< 0000000011D48720>"

# assign value to 7th position 
tracemem({vec[7] <- 6L}) 

tracemem [0x0000000011d48720 - > 0x00000000111a02b0]:
[1] "< 0000000012E25468>"

ベクトルが大きくなると、コピー処理にかかる時間が長くなります。


また、vec <- (1:(i*1000))が整数ベクトルであることに注意し、そしてvec[1] <- 0は概ねメモリ内のベクトルの大きさを倍増ダブルベクターにVEC変わり。

まず、整数ベクトルを作成し、サイズとタイプを確認します。

# start over with similar syntax to question 
tracemem({vec <- 1:10}) 

[1] "< 0000000011E55508>"

#チェックサイズ object.size(VEC)

88バイト

# check type 
typeof(vec) 

[1] "整数"

次に、7位、再チェックのサイズとタイプに0を割り当てる割り当てます。 0は当初の値と同じ値であるように見えますが、実際には整数ではなく2倍です。

# assign value 
tracemem({vec[7] <- 0}) 

tracemem [0x0000000011e55508 - > 0x0000000]:
tracemem [0x0000000- > 0x0000000013394740]:
[1] "< 00000000130EBA60>"

# check size 
object.size(vec) 

168バイト

ここ
# check type 
typeof(vec) 

[1] "ダブル"

お知らせ、二つの別々のコピー命令があること。私の推測では、最初はベクトルを整数からdoubleに変換するコピーで、2番目は代入です。

ベクトルを整数ベクトルとして保持するには、代わりにvec[1] <- 0Lを使用します。「L」は整数にすることをRに指示するためです。


注このコピー動作tracemem

+1

私はRがこれらのコピーを最適化していると思った。どうやらない。 –

+0

これらのコピーはどのバージョンのRで作成されていますか?一般的に(そして、 'vec'が別のオブジェクトによって参照されない限り)、' vec'は "整数"が割り当てられたときにはコピーされず、 "double"が割り当てられたときに一度だけコピー(強制)されます。ああ、それがRstudioになければ?私は同じことをもう一度覚えていると思います。 –

+1

私は現在、3.2.3 MS Revo Openを使用しています。私はかなりのコピーが私の理解であったのでコピーにかなり驚いた。数時間後に3.3.1のパッチを当ててこれを確認することを忘れないようにしようと思いますが、今私は同じ結果を得るだろうと思っています。 – lmo

関連する問題