上班时间,我弄这个,可见我有多无聊。 :D
我来瞎掰掰。。。。。。。
元素数>>列表总数据量/列表长度
转完整宽表是不适合的,所以才问他这三个指标。
我想说的是,在空间和时间之间我们是有一定选择权的:
分块转宽表,是这样一种方法:
元素10000个,我计算时200个元素构建一张宽表,(形成50张小表)。此时,进行压缩,若数据是稀疏的,即(元素数>>列表总数据量/列表长度),每张小表,存在大量的全false行,删除这些false行数据。每张小宽表的数据量会急剧减小。
极端情况下。
若是每个元素一张表,10000张表,每张表一列,删除每张表false值,就是长表(数据量级与长表相同)。
若是所有元素一张表,1张表,表10000列数,就是宽表(数据量级与款表相同)
并不一定要极端的选择长表或宽表
这简单的分块方法是长表与宽表计算的折中方案,而且适用于并行计算。
单核同配置计算来说。
表数越多,时间越长,内存占用越低。
表数越少,时间越短,内存占用越高。
直接循环计算比较快。
直接循环计算unlist(dm)和表,成一张表比较好。
他提到unlist(dm)内存不足(无法转化为一张表)。可以将dm分成数张表(仅仅分表,并不是转化为宽表),分别计算各部分元素数求和,之后将各部分加在一起。
按照他给的数量级。使用3楼方法,我模拟了下长表数据量100M左右,不需要分表。
列表长度:百万 (几十万)
列表总数据量:千万(百万以上)
元素种类数:2万(1万左右)
以下是直接循环长表的方法
length <- sample(1:20, 1000000, replace=T)
dm <- vector("list", 1000000)
for (i in 1:1000000){
dm[[i]] <- sample(1:20000, length[i], replace=T)
}
where <- rep(1:length(dm), times=length)
what <- unlist(dm)
where1<-where
what1<-what
while(length(what1)!=0){
#找出最大的元素
max<-which.max(table(what1))
print(names(max))
flag<-!where1%in%unique(where1[what1==names(max)[1]])
where1<-where1[flag]
what1<-what1[flag]
}
已经跑了快1个半小时了,还没跑完,20000个已经筛到300多个元素了,会越筛越快,瞎估计要算3~5小时左右:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22704 Rstudio 20 0 1734m 1.2g 11m R 99.8 31.7 80:57.84 rsession