2015-11-13 43 views
0

描述這種節省/差異的一般公式是什麼?通過使用R中的數組(而不是list,data.frame,data.table)可以保存多少RAM(內存)?

項考慮進行計算:

  • 陣列維數(標識列)
  • 每個維度的大小(在每種識別列的獨特元素)
  • 尺寸大小的產物(數組元素的個數,以上的唯一組合)
  • 每個維度的每個元素,當存儲在一個2D中,而不是數組格式(字符,整數,整數64,因子,雙精度,非常可能)時的每個元素的class()其他人)

我正在爲R軟件包(半內部軟件包)編寫函數的文檔,我想充分描述這一點。根據我(或你)的想法,我甚至可以編寫一個函數來計算這種差異,這樣用戶就可以在嘗試兩種方式(數據集相當大!)之前看到節省。

編輯:

# starting object 
d2 <- data.table(v=rnorm(10)) 
d2[,c("a","b","d","e"):=replicate(4, sample(1:20, 10), simplify=FALSE)] 
setkey(d2, a, b, d, e) 

# two casts to compare 
d2.cast <- d2[CJ(a,b,d,e)] # 2D structure 
dN.cast <- reshape2::acast(d2, a~b~d~e, value.var="v") # N-D structure 

# compare sizes 
print(object.size(d2.cast), units="Kb") 
print(object.size(dN.cast), units="Kb") 

打印(object.size(d2.cast),單位= 「KB」)
236.4 KB
打印(object.size(dN.cast) ,單位= 「KB」)
81 KB

並請,如果我使用的術語差,正確的。我想更好地描述這種情況:)

+0

這可能是有用的:http://adv-r.had.co.nz/memory.html – Molx

+0

也'數組'似乎有點小,但沒有那麼多。只是一個簡單的測試:'object.size(lapply(1:100,function(i)lapply(1:100,function(j)rnorm(100))))'and'object.size(array(rnorm(100^3),dim = c(100,100,100)))'。 (分別爲8484840和8000208字節)。 – Molx

+0

@Molx查看清單編輯,附帶示例。 2D對象要大得多,因爲它必須通過定義數組的尺寸來重複僅說明一次的信息。 – rbatt

回答

2

您應該能夠通過prod(dim(ar)) *字節數計算出數組的大小。
如果您的數據必須保留所有交叉維度的值(因此CJ在data.table中)並且只是一個度量值,那麼最好使用數組。
另一方面,使用2D數據可以從所有冗餘維交叉中刪除NA值。它可以顯着減少所需的RAM數量,在許多情況下允許多維數據足夠的擴展以進行分析。
與數組不同,2D建模數據可以存儲多個度量。
2D在分區和分佈式計算方面看起來更友好。

所以它完全依賴於數據,但IMO在大多數情況下陣列根本不能縮放,而2D表格或星型模式一組2D表格可以很好地縮放。
如果你想潛水多一點這個,你可以檢查設計與建模data.table星型模式擴展多維數據我在dev軟件包data.cube


此外定義星型模式作爲一個簡單的工具來存儲和處理多維數據。

星型模型的中心對象,事實表

#  prod_name time_date geog_abb amount  value 
# 1: AMC Javelin 2010-01-02  AK 23.64 5193.2088 
# 2: AMC Javelin 2010-01-02  MD 88.02 1559.0968 

指三維陣列,其中尺寸產品的時間和地理位置,以及兩項措施。
數組不會驅動維的屬性層次結構,只是它是字符自然鍵或整數索引。
表格結構允許爲事實表中的每個維度關鍵字創建查找表。訪問數據可以參考更高級別的屬性來分析數據時

$dims$product 
#    prod_name prod_cyl prod_vs prod_am prod_gear 
# 1:   AMC Javelin  8  0  0   3 
# 2: Cadillac Fleetwood  8  0  0   3 

$dims$time 
#  time_date time_month time_month_name time_quarter time_quarter_name time_year 
# 1: 2010-01-01   1   January   1    Q1  2010 
# 2: 2010-01-02   1   January   1    Q1  2010 

$dims$geography 
# geog_abb  geog_name geog_division_name geog_region_name 
# 1:  AK   Alaska   Pacific    West 
# 2:  AL  Alabama East South Central   South 
# 3:  AR  Arkansas West South Central   South 

後來,聯接是自動的工具來處理:
所得爲3個維度表。
這是基本的星型模式,也是從所有維度的交叉乘積中去除NA值的簡單方法。
在每個維度中定義了層次結構後,您可以做更多的事情。
data.cube包中,您可以使用populate_star(1e5)生成銷售事實表和5個維度。


在最後一節中,封裝插圖Subset multidimensional data中提供了很少的內存消耗測試。

+0

也許你可以提供一個「星圖」的參考..?我沒有聽說過。尼斯網站,順便說一句:) – Frank

+0

@Frank我編輯了答案,讓我知道如果有什麼不明確:) – jangorecki

+0

很酷的感謝。我只記得數據庫設計中的「標準化」。你在這裏描述的星型模式也粗略地(我認爲)我如何組織數據。 – Frank

相關問題