如何在不浪费内存的情况下更改矩阵切片的维度?
大内存矩阵的低内存占用操作方案疑问
我有一个规模较大(例如千兆字节级)的数值矩阵。需要直接将其作为矩阵传入第三方包函数完成部分计算,同时在另一些计算场景中,需将矩阵的不同切片分别视为二维或三维数组(不同切片可使用不同维度)。我想知道如何以尽可能少的内存占用完成这两类操作。
以下是我用小矩阵(2×9)做的演示示例:
m <- matrix(sample(18,2*(1+2*2+2*2)),nrow=2,ncol=1+2*2+2*2) ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] ## [1,] 3 10 12 2 7 15 6 1 9 ## [2,] 8 4 18 17 13 14 11 16 5 #### 直接将矩阵传入第三方函数计算 ## some_result <- function_from_some_package(m) #### 将切片重新视为二维矩阵并计算正态密度 somedata <- matrix(1:4, ncol=2) # 数据来自外部 values <- dnorm(somedata, mean=matrix(m[1,2:5],nrow=2,ncol=2), sd=matrix(m[1,6:9],nrow=2,ncol=2)) ## [,1] [,2] ## [1,] 0.01978261 0.0242596 ## [2,] 0.00951157 0.0303845
我通过修改切片维度的方式实现需求,但担心R会在内部创建两个新对象——分别对应matrix(m[1,2:5],nrow=2,ncol=2)和matrix(m[1,6:9],nrow=2,ncol=2),这在千兆字节级的场景下会造成大量内存浪费。
补充测试:用tracemem工具检测发现,切片被复制了两次——一次是生成dnorm的输入时,另一次是dnorm内部复制mean参数时。
内容的提问来源于stack exchange,提问作者pglpm
相关产品推荐
相关产品推荐

