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,
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,
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, doSMP和foreach 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)
result.1
result.2
result.3
result.4
> 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),那么这两个工具是连在一起的,同时变革。
==============================================
>
[1,]
[2,]
[3,]
[4,]
>
>
[1,]
[2,]
[3,]
>
[1,]
> i2 <- iter(a, by = “column”, checkFunc=function(x) sum(x) > 50)
> nextElem(i2)
[1,]
[2,]
[3,]
[4,]
> nextElem(i2)
[1,]
[2,]
[3,]
[4,]
> 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
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