R语言处理惩罚大数据
当前位置:以往代写 > 其他教程 >R语言处理惩罚大数据
2019-06-14

R语言处理惩罚大数据

R语言处理惩罚大数据

R较大的缺点就是不能举办并行计较和内存限制。


内存限制的打破
“参考网址1”中提到假如只是对整数运算(运算进程和功效都只利用整数),没有须要利用“double”(8 byte),而应该用更小的“integer”(4 byte)。利用storage.mode(x)查察工具存数的模式,storage.mode(x) <- 举办赋值;利用object.size(a)查察工具占用的内存空间(此处有疑问,即在R中每个integer到底占用了多大的空间?)。
需要表明gc( )函数,可以查察内存利用环境。同样,在排除了大的工具之后,利用gc( )以释放内存利用空间。


李航在”参考网址2“中提到,对付大矩阵的操纵,只管制止利用cbind和rbind之类,因为这会让内存不断地分派空间。“对付长度增加的矩阵,只管先界说一个大矩阵,然后慢慢增加”和“留意排除中间工具”。


利用bigmemory家属:bigmemory, biganalytics, synchronicity, bigtabulate and bigalgebra,同时尚有
biglm
bigmemory package的利用:
1 成立big.memory工具
bigmemory回收C++的数据名目来“仿照”R中的matrix。
编写大数据名目文件时候,可以先成立filebacked.big.matrix
big.matrix(nrow, ncol, type = options()$bigmemory.default.type, init = NULL, dimnames = NULL, separated = FALSE, backingfile = NULL, backingpath = NULL, descriptorfile = NULL, shared = TRUE)
filebacked.big.matrix(nrow, ncol, type = options()$bigmemory.default.type, init = NULL, dimnames = NULL, separated = FALSE, backingfile = NULL, backingpath = NULL, descriptorfile = NULL)
as.big.matrix(x, type = NULL, separated = FALSE, backingfile = NULL, backingpath = NULL, descriptorfile = NULL, shared=TRUE)
利用留意:
big.matrix回收两种方法储存数据:一种是big.matrix默认的方法,假如内存空间较量大,可以实验利用;别的一种是filebacked.big.matrix,这种储存要领大概会备份文件(file-backings),并且需要descriptor file;
“init”指矩阵的初始化数值;假如不配置,将处理惩罚为NA
“type”是指在big.matrix中atomic element的储存名目,默认是“double”(8 byte),可以改为“integer”(4 byte), “short”(2 byte) or “char”(1 byte);
在big.matrix很是大的时候,制止利用rownames和colnames(而且bigmemory克制用名称会见元素),因为这种做法很是占用内存。假如必然要改变,利用options(bigmemory.allow.dimnames=TRUE),之后colnames, rownames配置。
直接在呼吁提示符后输入x(x是一个big matrix),将返回x的描写,不会呈现所有x中所有内容。因此,留意x[ , ](打印出矩阵全部内容);
假如big.matrix有许多列,那么应该将其转置后储存;(不推荐)可能将参数“separated”配置为TRUE,这样就将每一列分隔储存。不然,将用R的传统方法(column major的方法)储存数据。
假如成立一个filebacked.big.matrix,那么需要指定backingfile的名称和路径+descriptorfile。大概多个big.matrix工具对应一个descriptorfile,即假如descriptorfile改变,所以对应的big.matrix随之改变;同样,decriptorfile跟着big.matrix的改变而改变;假如想维持一种改变,需要从头成立一个filebacked.big.matrix。attach.big.matrix(descriptorfile or describe(big.matrix))函数用于将一个descriptorfile赋值给一个big.matrix。这个函数很好用,因为每次在建设一个filebacked.big.matrix后,生存R并退出后,先前建设的矩阵会消失,需要再attach.big.matrix以下


2 对big.matrix的列的特定元素举办条件筛选
对内存没有限制;并且比传统的which越发机动(赞!)
mwhich(x, cols, vals, comps, op = ‘AND’)
x既可以是big.matrix,也可以是传统的R工具;
cols:行数
vals:cutoff,可以设定两个好比c(1, 2)
comps:‘eq'(==), ‘neq'(!=), ‘le'(<), ‘lt'(<=), ‘ge'(>) and ‘gt'(>=)
op:“AND”可能是“OR”
可以直接较量NA,Inf和-Inf


3 bigmemory中其他函数
nrow, ncol, dim, dimnames, tail, head, typeof担任base包
big.matrix, is.big.matrix, as.big.matrix, attach.big.matrix, describe, read.big.matrix, write.big.matrix, sub.big.matrix, is.sub.big.matrix为特有的big.matrix文件操纵;filebacked.big.matrix, is.filebacked(判定big.matrix是否硬盘备份) , flush(将filebacked的文件刷新到硬盘备份上)是filebacked的big.matrix的操纵。
mwhich加强base包中的which, morder加强order,mpermute(对matrix中的一列凭据特定序列操纵,可是会改变本来工具,这是为了制止内存溢出)
big.matrix工具的copy利用deepcopy(x, cols = NULL, rows = NULL, y = NULL, type = NULL, separated = NULL, backingfile = NULL, backingpath = NULL, descriptorfile = NULL, shared=TRUE)


biganalytics package的利用
biganalytics主要是一些base根基函数的扩展,主要有max, min, prod, sum, range, colmin, colmax, colsum, colprod, colmean, colsd, colvar, summary等
较量有特色的是bigkmeans的聚类
剩下的biglm.big.matrix和bigglm.big.matrix可以参考Lumley’s biglm package。


bigtabulate package的利用


并行计较限制的打破:
利用doMC家属:doMC, doSNOW, doMPI, doRedis, doSMPforeach packages.


foreach package的利用
foreach(…, .combine, .init, .final=NULL, .inorder=TRUE, .multicombine=FALSE, .maxcombine=if (.multicombine) 100 else 2, .errorhandling=c(‘stop’, ‘remove’, ‘pass’), .packages=NULL, .export=NULL, .noexport=NULL, .verbose=FALSE)
foreach的特点是可以举办并行运算,如在NetWorkSpace和snow?
%do%顺序执行任务,%dopar%并行执行任务
…:指定轮回的次数;
.combine:运算之后功效的显示方法,default是list,“c”返回vector, cbind和rbind返回矩阵,”+”和”*”可以返回rbind之后的“+”可能“*”
.init:.combine函数的第一个变量
.final:返回最后功效
.inorder:TRUE则返回和原始输入沟通顺序的功效(对功效的顺序要求严格的时候),FALSE返回没有顺序的功效(可以提高运算效率)
.muticombine:设定.combine函数的通报参数,default是FALSE暗示其参数是2,TRUE可以设定多个参数
.maxcombine:设定.combine的较大参数
.errorhandling:假如轮回中呈现错误,对错误的处理惩罚要领
.packages:指定在%dopar%运算进程中依赖的package(%do%会忽略这个选项)。


getDoParWorkers( ) :查察注册了几多个核,共同doMC package中的registerDoMC( )利用
getDoParRegistered( ) :查察doPar是否注册;假如没有注册返回FALSE
getDoParName( ) :查察已经注册的doPar的名字
getDoParVersion( ):查察已经注册的doPar的version
===================================================
# foreach的轮回次数可以指定多个变量,可是只用个中最少?的

> foreach(a = 1:10, b = rep(10, 3)) %do% (a*b)
[[1]]
[1] 10


[[2]]
[1] 20


[[3]]
[1] 30


# foreach中.combine的“+”可能“*”是cbind之后的操纵;这也就是说”expression”返回一个向量,会对向量+可能*

> foreach(i = 1:4, .combine = “+”) %do% 2
[1] 8

> foreach(i = 1:4, .combine = “rbind”) %do% rep(2, 5)
[,1] [,2] [,3] [,4] [,5]
result.1 2 2 2 2 2
result.2 2 2 2 2 2
result.3 2 2 2 2 2
result.4 2 2 2 2 2

> foreach(i = 1:4, .combine = “+”) %do% rep(2, 5)
[1] 8 8 8 8 8
> foreach(i = 1:4, .combine = “*”) %do% rep(2, 5)
[1] 16 16 16 16 16
=============================================



iterators package的利用
iterators是为了给foreach提供轮回变量,每次界说一个iterator,它都内定了“轮回次数”和“每次轮回返回的值”,因此很是适合团结foreach的利用
iter(obj, …):可以接管iter, vector, matrix, data.frame, function。
nextElem(obj, …):接管iter工具,显示工具数值。
以matrix为例,
iter(obj, by=c(‘column’, ‘cell’, ‘row’), chunksize=1L, checkFunc=function(…) TRUE, recycle=FALSE, …)
by:凭据什么顺序轮回;matrix和data.frame都默认是“row”,“cell”是按列依次输出(所以对付“cell”,chunksize只能指定为默认值,即1)
chunksize:每次执行函数nextElem后,凭据by的设定返回功效的长度。假如返回布局不足,将取剩余的全部。
checkFunc=function(…) TRUE:执行函数checkFun,假如返回TRUE,则返回;不然,跳过。
recycle:设定在nextElem轮回到底(“错误: StopIteration”)是否要轮回处理惩罚,即从新再来一遍。
以function为例
iter(function()rnorm(1)),利用nextElem可以无限反复;可是iter(rnorm(1)),只能来一下。
更有意思的是工具假如是iter,即test1 <- iter(obj); test2 <- iter(test1),那么这两个工具是连在一起的,同时变革。

==============================================

> a
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20

> i2 <- iter(a, by = “row”, chunksize=3)
> nextElem(i2)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
> nextElem(i2) #第二次iterate之后,只剩下1行,全部返回
[,1] [,2] [,3] [,4] [,5]
[1,] 4 8 12 16 20

> i2 <- iter(a, by = “column”, checkFunc=function(x) sum(x) > 50)
> nextElem(i2)
[,1]
[1,] 13
[2,] 14
[3,] 15
[4,] 16
> nextElem(i2)
[,1]
[1,] 17
[2,] 18
[3,] 19
[4,] 20
> nextElem(i2)
错误: StopIteration

> colSums(a)
[1] 10 26 42 58 74
> testFun <- function(x){return(x+2)}

> i2 <- iter(function()testFun(1))
> nextElem(i2)
[1] 3
> nextElem(i2)
[1] 3
> nextElem(i2)
[1] 3

> i2 <- iter(testFun(1))
> nextElem(i2)
[1] 3
> nextElem(i2)
错误: StopIteration

> i2 <- iter(testFun(1))
> i3 <- iter(i2)
> nextElem(i3)
[1] 3
> nextElem(i2)
错误: StopIteration
============================================
iterators package中包罗
irnorm(…, count);irunif(…, count);irbinom(…, count);irnbinom(…, count);irpois(…, count)中内部生成iterator的东西,别离暗示从normal,uniform,binomial,negativity binomial和Poisson漫衍中随机选取N个元素,举办count次。个中,negative binomial漫衍:其概率积聚函数(probability mass function)为掷骰子,每次骰子为3点的概率为p,在第r+k次刚好呈现r次的概率。
icount(count)可以生成1:conunt的iterator;假如count不指定,将从无休止生成1:Inf
icountn(vn)较量好玩,vn是指一个数值向量(假如是小数,则向后一个数取整,好比2.3 –> 3)。轮回次数为prod(vn),每次返回的向量中每个元素都从1开始,不高出设定 vn,变革速率从左向右依次递增。
idiv(n, …, chunks, chunkSize)返回截取从1:n的片断长度,“chunks”和“chunkSize”不能同时指定,“chunks”为分几多片断(长度从大到小),“chunkSize”为分段的较大长度(长度由大到小)
iapply(X, MARGIN):与apply很像,MARGIN中1是row,2是column
isplit(x, f, drop=FALSE, …):凭据指定的f分别矩阵


=============================================

> i2 <- icountn(c(3.4, 1.2))
> nextElem(i2)
[1] 1 1
> nextElem(i2)
[1] 2 1
> nextElem(i2)
[1] 3 1
> nextElem(i2)
[1] 4 1
> nextElem(i2)
[1] 1 2
> nextElem(i2)
[1] 2 2
> nextElem(i2)
[1] 3 2
> nextElem(i2)
[1] 4 2
> nextElem(i2)
错误: StopIteration

    关键字:

在线提交作业