2015-11-13 91 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

相关问题