2011-01-19 2 views
3

私はRの初心者です。メモリレイアウトがデータフレームとマトリックスで同じであるとします。次の行列データフレーム(マトリックス)パフォーマンス:メモリレイアウト

=マトリックス(1:10000000,1000000,10)で

それを1Mの行と10列を有しています。行または列のメモリは物理的に連続していますか?または、物理メモリは、[1,1]、[2,1]、[3,1] ,, [1M、1]、[2,1]または[1,2]、[1,2] .. [1,10]、[2,1] ...?

10M要素の行列のサイズが100Mで、L2キャッシュが4Mであるとすると、L2キャッシュはこれらの10M要素をすべて格納できません。データを順番に処理すると、L2キャッシュ不足率が少なくなります。私たちの場合、列A、B、Cのように、行単位で処理し、同時に複数の列を読み込んで結果を作成する必要があります。メモリのレイアウトが最初の行に10個のアイテムを最初に格納し、次に2番目の行に10個のアイテムを格納すると、パフォーマンスが向上する可能性があります。

メモリレイアウトを制御する方法があれば、

+0

'a'と' t(a')を比較して、行/列に多くの効果があるかどうかを調べることができます。 –

答えて

2

マトリックスは単にdim属性のベクトルです。行列の要素は、列の主要な順序でベクトルに格納されます。これを変更する方法はありません。

したがって、行単位で操作する必要がある場合は、行列をループオーバーする前に移調する方が高速です。

> set.seed(21) 
> a = matrix(rnorm(1e6),1e3,1e3) 
> ta = t(a) 
> system.time(for(i in 1:1000) colSums(ta)) 
    user system elapsed 
    1.39 0.00 1.40 
> system.time(for(i in 1:1000) rowSums(a)) 
    user system elapsed 
    2.40 0.00 2.39 
> identical(rowSums(a), colSums(ta)) 
[1] TRUE 

あなたは深く掘るしたい場合は、colSumsrowSumscolMeans、およびrowMeansのコードがsrc/main/array.cdo_colsum機能です。

6

行列は列方向に格納されます。

> m=matrix(1:12,nrow=3) 
> m 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

データフレームだけでかなりのリストであり、リストは要素のベクトルとして保存されます。私は、リストの要素がメモリ内で連続していることが保証されているかどうかも分かりません。

メモリがどのように処理されるかの詳細については、Rエクステンションを読み上げてください。私が知る限り、メモリのレイアウトを制御する方法はありません。それが問題になるまで心配しないでください。

関連する問題