2011-01-19 18 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元素。如果我們按順序處理數據,我們將會減少二級緩存缺失率。對於我們的情況,我們需要逐行處理並同時讀取幾列,例如列A,B,C,然後創建一些結果。如果內存的佈局首先在第一行中存儲10個項目,然後在第二行中存儲10個項目,則性能可能會更好。

如果有什麼辦法來控制內存佈局?

+0

您可以嘗試比較使用`a`與`t(a`)來查看行/列是否有很大影響。 – 2011-01-19 14:55:14

回答

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 

如果您想更深入,代碼爲colSumsrowSumscolMeansrowMeans是在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擴展。據我所知,沒有辦法控制內存佈局。在它成爲問題之前不要擔心。