bigmemory: 管理大规模矩阵的共享内存以及映射文件
1 描述bigmemory
bigmemory负责创建,存储,访问和操作大量的矩阵。矩阵,默认情况下会分配给共享内存并且可以使用内存映射文件。
biganalytics, synchronicity, bigalgebra, and bigtabulate 这些包提供先进的分析功能。
通过S4可以访问和操作big.matrix(bigmemory包中使用的一种对象),S4这种接口和R中默认的matrix接口非常相似。使用这些包在并行环境中也能提供大量的速度和内存效率。bigmemory还提供了一个C ++框架,用于开发新工具,可以工作在同时操作big.matrix和原生态的R矩阵两种对象。
即使使用装备精良的硬件,1G以上的数据集的对R用户来说不仅是挑战和有时候更能挫败强大的内心,使用C / C + +确实可以提高效率,但是累赘的交互式数据分析使得R丰富的统计编程环境力量缺乏灵活性。包bigmemory和妹妹包biganalytics, synchronicity, bigalgebra, and bigtabulate打开了这个难以逾越的鸿沟,使得大规模矩阵门槛变低并支持对他们的操作和探索。该数据结构可以分配给共享内存,允许在同一台计算机上单独的进程共享访问数据集的单个副本。数据结构也可能是来指文件的支持,允许用户轻松管理和分析比可用的内存更大的数据集,并且在一个集群中的节点共享这些数据。该Bigmemory项目的这些特性打开了对海量数据集强大的数据分析以及高效利用内存的大门的。
2 函数列表
big.matrix, filebacked.big.matrix, as.big.matrix
bigmemory-package
is.big.matrix, is.separated, is.filebacked
describe, attach.big.matrix, attach.resource
sub.big.matrix, is.sub.big.matrix
dim, dimnames, nrow, ncol, print, head, tail, typeof, length
read.big.matrix, write.big.matrix
mwhich
morder, mpermute
deepcopy
flush
3 操作实例
//第一组操作:基本赋值,查询
> x <- big.matrix(10, 2, type='integer', init=-5)
> colnames(x) <- c('alpha', 'beta')
错误于`dimnames<-`(`*tmp*`, value = dn) :
Changing dimnames is not allowed; to override, please set options(bigmemory.allow.dimnames=TRUE).
> options(bigmemory.allow.dimnames=TRUE)
> colnames(x) <- c('alpha', 'beta')
> is.big.matrix(x)
[1] TRUE
> dim(x)
[1] 10 2
> colnames(x)
[1] "alpha" "beta"
> dim(x)
[1] 10 2
> colnames(x)
[1] "alpha" "beta"
> rownames(x)
NULL
> x[,]
alpha beta
[1,] -5 -5
[2,] -5 -5
[3,] -5 -5
[4,] -5 -5
[5,] -5 -5
[6,] -5 -5
[7,] -5 -5
[8,] -5 -5
[9,] -5 -5
[10,] -5 -5
> x[1:8,1] <- 11:18
> colnames(x) <- NULL
> x[,]
[,1] [,2]
[1,] 11 -5
[2,] 12 -5
[3,] 13 -5
[4,] 14 -5
[5,] 15 -5
[6,] 16 -5
[7,] 17 -5
[8,] 18 -5
[9,] -5 -5
[10,] -5 -5
//第二组操作:基本类型转换
> x <- as.big.matrix(matrix(-5, 10, 2))
> is.big.matrix(x)
[1] TRUE
> xdesc <- describe(x)
> xdesc
An object of class "big.matrix.descriptor"
Slot "description":
$sharedType
[1] "SharedMemory"
$sharedName
[1] "a8f3ebb6-aec4-4c2d-b6ff-730c207fc0b7"
$totalRows
[1] 10
$totalCols
[1] 2
$rowOffset
[1] 0 10
$colOffset
[1] 0 2
$nrow
[1] 10
$ncol
[1] 2
$rowNames
NULL
$colNames
NULL
$type
[1] "double"
$separated
[1] FALSE
//第三组操作:从文件中回收大数据
> y <- attach.big.matrix(xdesc)
> y[,]
[,1] [,2]
[1,] -5 -5
[2,] -5 -5
[3,] -5 -5
[4,] -5 -5
[5,] -5 -5
[6,] -5 -5
[7,] -5 -5
[8,] -5 -5
[9,] -5 -5
[10,] -5 -5
> file <- dir()
> file[grep("bigdata.bin", file)]
[1] "bigdata.bin"
> file[grep("example.bin", file)]
character(0)
//第四组:复制大数据矩阵
> x <- as.big.matrix(matrix(1:30, 10, 3))
> y <- deepcopy(x,-1)
> x
An object of class "big.matrix"
Slot "address":
<pointer: 0xa6d7720>
> y
An object of class "big.matrix"
Slot "address":
<pointer: 0xa45bae0>
> head(x)
[,1] [,2] [,3]
[1,] 1 11 21
[2,] 2 12 22
[3,] 3 13 23
[4,] 4 14 24
[5,] 5 15 25
[6,] 6 16 26
> head(y)
[,1] [,2]
[1,] 11 21
[2,] 12 22
[3,] 13 23
[4,] 14 24
[5,] 15 25
[6,] 16 26
//第五组:选择子矩阵
mwhich 使用说明
第一个参数:是需要操作的矩阵
第二个参数:是需要操作的列
第三个操作:list对象,第一列表示第二个参数对应的第一列的范围以此类推
第四个参数:也是与第二个参数对应,执行什么样的逻辑判断ge表示大于等于,le表示小于等于等,以此类推
第五个参数:表示这些逻辑判断最终以什么样的方式组合在一起
不明白请看例子:
> x[mwhich(x, 1:2, list(c(2,3), c(13,17)), list(c('ge','le'), c('gt', 'lt')), 'OR'),]
A B C
[1,] 2 12 22
[2,] 3 13 23
[3,] 4 14 24
[4,] 5 15 25
[5,] 6 16 26
> x[mwhich(x, 1:2, list(c(2,3), c(14,17)), list(c('ge','le'), c('gt', 'lt')), 'OR'),]
A B C
[1,] 2 12 22
[2,] 3 13 23
[3,] 5 15 25
[4,] 6 16 26
> x[1,1] <- NA
> x[,]
A B C
[1,] NA 11 21
[2,] 2 12 22
[3,] 3 13 23
[4,] 4 14 24
[5,] 5 15 25
[6,] 6 16 26
[7,] 7 17 27
[8,] 8 18 28
[9,] 9 19 29
[10,] 10 20 30
> mwhich(x, 1:2, NA, 'eq', 'OR')
[1] 1
> mwhich(x, 1:2, NA, 'neq', 'AND')
[1] 2 3 4 5 6 7 8 9 10
//下面是另一种方法选择子数组 sub.big.matrix
第一个参数不用多说,第二个参数是起始行 第三个参数是结束行 第四个参数是开始列 第五个参数是结束列
> y <- sub.big.matrix(x, 2, 9, 2, 3)
> y[,]
[,1] [,2]
[1,] 12 22
[2,] 13 23
[3,] 14 24
[4,] 15 25
[5,] 16 26
[6,] 17 27
[7,] 18 28
[8,] 19 29
> x[,]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 11 21 31 41
[2,] 2 12 22 32 42
[3,] 3 13 23 33 43
[4,] 4 14 24 34 44
[5,] 5 15 25 35 45
[6,] 6 16 26 36 46
[7,] 7 17 27 37 47
[8,] 8 18 28 38 48
[9,] 9 19 29 39 49
[10,] 10 20 30 40 50
//特别注意y一变,x也就变了
> y[1,1] <- 199
> x[,]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 11 21 31 41
[2,] 2 199 22 32 42
[3,] 3 13 23 33 43
[4,] 4 14 24 34 44
[5,] 5 15 25 35 45
[6,] 6 16 26 36 46
[7,] 7 17 27 37 47
[8,] 8 18 28 38 48
[9,] 9 19 29 39 49
[10,] 10 20 30 40 50
//第六组:也是很有用的读取数据,大数据总要读进来吧,所以开始尽情享受bigmemory吧!
write.big.matrix(x, filename, row.names = FALSE,col.names = FALSE, sep= , )
read.big.matrix(filename, sep = , , header = FALSE,col.names = NULL, row.names = NULL,
has.row.names=FALSE, ignore.row.names=FALSE,
type = NA, skip = 0, separated = FALSE,
backingfile = NULL, backingpath = NULL,
descriptorfile = NULL, binarydescriptor=FALSE,
extraCols = NULL, shared=TRUE)