《R高性能编程》notes(2)

《R高性能编程》notes(2)_第1张图片
chapter+6+减少内存使用的简单方法.png

注解:
修改时复制copy-on-modification:
即从已有对象创建新的对象有时并不需要占用额外内存

//检查对象大小
object.size() 
pryr包的object_size()
//查看对象所指内存块
pryr包的address()
//追踪对象复制方法
tracemem()

运行时计算值部分 实例 -- 层次聚类

//方法1:计算每对观察值的距离矩阵然后决定哪一对最近
A<-matrix(rnorm(1E5),1E4,10)
dist_mat<-as.matrix(dist(A))
diag(dist_mat)<-NA
res1<-which(dist_mat==min(dist_mat,na.rm=T),arr.ind=T)[1,]
object_size(A)
##800k
object_size(dist_mat)
##801MB
//距离矩阵需要成倍的内存空间存储所有观察对的距离

//方法二:可以逐对计算,需要内存少,但时间长
library(pdist)
temp_res<-lapply(1:nrow(A),function(x){
temp<-as.matrix(pdist(X=A,Y=A[x,]));
temp[x]<-NA;
output_val<-min(temp,na.rm=T);
output_ind<-c(x,which(temp==output_val));
output<-list(val=output_val,ind=output_ind);
})
val_vec<-sapply(temp_res,FUN=function(x) x$val)
ind_vec<-sapply(temp_res,FUN=function(x) x$ind)
res2<-ind_vec[,which.min(val_vec)]
object_size(temp_res)
##2.72MB
object_size(val_vec)
##80kB
object_size(ind_vec)
##80.2kB

(1)方法2在实际应用可以采用FNN包的knn();
(2)代码并行化:用parallel包的parLApply()代替lapply()

你可能感兴趣的:(《R高性能编程》notes(2))