r 中的稀疏矩阵大小与常规矩阵大小
Sparse Matrix size vs Regular Matrix size in r
我的常规矩阵的对象大小为 416 字节,当我使用 as(, "sparseMatrix")
将其转换为稀疏矩阵时,此稀疏矩阵的大小增加到 1720 字节。
正常吗?我们不应该期望稀疏矩阵的存储大小比常规矩阵小吗?
非常感谢!
matrix
是 R 的基本数据结构之一,可以用很少的元数据存储:它是一个值序列,每个维度和数据类型只有一个长度。
然而,sparseMatrix
对象包含更多元数据,您将在下面的示例中看到 str()
。最突出的是,对于每个 non-zero 值,除了值本身之外,还会存储一个 (x,y) 位置。如果您要存储整数,仅此一项就会导致内存使用量增加三倍。这只有在有很多零值时才会得到补偿,因为它们根本没有存储。
密集示例
比较没有零值的矩阵:
> mat1 = matrix( sample(3*3), c(3, 3))
> smat1 <- as(mat1, "sparseMatrix")
> showMem(c('mat1', 'smat1'), bytes=T)
size bytes
mat1 264 B 264
smat1 1.7 kB 1688
> mat1
[,1] [,2] [,3]
[1,] 2 5 7
[2,] 8 6 1
[3,] 3 4 9
> str(mat1)
int [1:3, 1:3] 2 8 3 5 6 4 7 1 9
> str(smat1)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:9] 0 1 2 0 1 2 0 1 2
..@ p : int [1:4] 0 3 6 9
..@ Dim : int [1:2] 3 3
..@ Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
..@ x : num [1:9] 2 8 3 5 6 4 7 1 9
..@ factors : list()
或此类矩阵的放大版本:
> mat2 = matrix( sample(1000*1000), c(1000, 1000))
> smat2 <- as(mat2, "sparseMatrix")
> showMem(c('mat2', 'smat2'), bytes=T)
size bytes
mat2 4 MB 4000216
smat2 12 MB 12005504
稀疏示例
这里我们创建了一个更稀疏的矩阵,有 6 个零,只有 3 个值。我们可以看到 sparseMatrix 只存储了 3 个值。
> mat3 = matrix( sample(3*3)%%3%%2, c(3, 3))
> smat3 <- as(mat3, "sparseMatrix")
> showMem(c('mat3', 'smat3'), bytes=T)
size bytes
mat3 344 B 344
smat3 1.6 kB 1560
> mat3
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 0 0 0
[3,] 1 0 1
> str(mat3)
num [1:3, 1:3] 0 0 1 1 0 0 0 0 1
> str(smat3)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:3] 2 0 2
..@ p : int [1:4] 0 1 2 3
..@ Dim : int [1:2] 3 3
..@ Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
..@ x : num [1:3] 1 1 1
..@ factors : list()
最后是 sparseMatrix 给出预期内存节省的情况:
> mat4 = matrix( sample(1000*1000)%%3%%2, c(1000, 1000))
> smat4 <- as(mat4, "sparseMatrix")
> table(mat4)
mat4
0 1
666666 333334
> showMem(c('mat4', 'smat4'), bytes=T)
size bytes
mat4 8 MB 8000216
smat4 4 MB 4005512
我的常规矩阵的对象大小为 416 字节,当我使用 as(, "sparseMatrix")
将其转换为稀疏矩阵时,此稀疏矩阵的大小增加到 1720 字节。
正常吗?我们不应该期望稀疏矩阵的存储大小比常规矩阵小吗?
非常感谢!
matrix
是 R 的基本数据结构之一,可以用很少的元数据存储:它是一个值序列,每个维度和数据类型只有一个长度。
sparseMatrix
对象包含更多元数据,您将在下面的示例中看到 str()
。最突出的是,对于每个 non-zero 值,除了值本身之外,还会存储一个 (x,y) 位置。如果您要存储整数,仅此一项就会导致内存使用量增加三倍。这只有在有很多零值时才会得到补偿,因为它们根本没有存储。
密集示例
比较没有零值的矩阵:
> mat1 = matrix( sample(3*3), c(3, 3))
> smat1 <- as(mat1, "sparseMatrix")
> showMem(c('mat1', 'smat1'), bytes=T)
size bytes
mat1 264 B 264
smat1 1.7 kB 1688
> mat1
[,1] [,2] [,3]
[1,] 2 5 7
[2,] 8 6 1
[3,] 3 4 9
> str(mat1)
int [1:3, 1:3] 2 8 3 5 6 4 7 1 9
> str(smat1)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:9] 0 1 2 0 1 2 0 1 2
..@ p : int [1:4] 0 3 6 9
..@ Dim : int [1:2] 3 3
..@ Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
..@ x : num [1:9] 2 8 3 5 6 4 7 1 9
..@ factors : list()
或此类矩阵的放大版本:
> mat2 = matrix( sample(1000*1000), c(1000, 1000))
> smat2 <- as(mat2, "sparseMatrix")
> showMem(c('mat2', 'smat2'), bytes=T)
size bytes
mat2 4 MB 4000216
smat2 12 MB 12005504
稀疏示例
这里我们创建了一个更稀疏的矩阵,有 6 个零,只有 3 个值。我们可以看到 sparseMatrix 只存储了 3 个值。
> mat3 = matrix( sample(3*3)%%3%%2, c(3, 3))
> smat3 <- as(mat3, "sparseMatrix")
> showMem(c('mat3', 'smat3'), bytes=T)
size bytes
mat3 344 B 344
smat3 1.6 kB 1560
> mat3
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 0 0 0
[3,] 1 0 1
> str(mat3)
num [1:3, 1:3] 0 0 1 1 0 0 0 0 1
> str(smat3)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
..@ i : int [1:3] 2 0 2
..@ p : int [1:4] 0 1 2 3
..@ Dim : int [1:2] 3 3
..@ Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
..@ x : num [1:3] 1 1 1
..@ factors : list()
最后是 sparseMatrix 给出预期内存节省的情况:
> mat4 = matrix( sample(1000*1000)%%3%%2, c(1000, 1000))
> smat4 <- as(mat4, "sparseMatrix")
> table(mat4)
mat4
0 1
666666 333334
> showMem(c('mat4', 'smat4'), bytes=T)
size bytes
mat4 8 MB 8000216
smat4 4 MB 4005512