首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用cbind分配r内存

用cbind分配r内存
EN

Stack Overflow用户
提问于 2017-04-18 17:16:29
回答 1查看 319关注 0票数 1

我正在取一个大的(密集的)网络矩阵,并把它转换成一个编辑专家。然而,当我这样做时,分配给R的内存似乎是疯狂的。在我的例子中,我有一个12 my的矩阵(1259x1259),当转换成一个编辑家(i,j,w)时,它占用了71 my的内存!我正在使用it包来执行这些操作,但我不认为它与此相关。以下是我对合成数据所做的工作。

代码语言:javascript
复制
library(igraph)
A <- matrix(runif(25), 5, 5)
A <- A %*% t(A)
diag(A) <- 0

我做了矩阵对称和对角线0,因为这是我的数据的样子,但我认为这与这个问题无关。在这里,我使用照片:

代码语言:javascript
复制
# using igraph here
adj <- graph.adjacency(as.matrix(A),weighted=TRUE)
object.size(A) # 400 bytes
object.size(adj) # 2336 bytes

我知道照片的物体会更大。这不是问题所在。

代码语言:javascript
复制
el <- get.edgelist(adj)
class(el) # "matrix"
object.size(el) # 520 bytes

w <- E(adj)$weight
class(w) # "numeric"
object.size(w) # 200 bytes

# expect something ~720 bytes
adj_w <- cbind(el,w)
class(adj_w) # "matrix"
object.size(adj_w) # 1016 bytes

为什么adj_w上的内存要大得多?它甚至看起来并不是线性的,因为这里的原始到最终是400字节到1016字节,但是在我(更大的)数据中,它是12 my到71 my。

FYI:我在最新版本的Macbook Pro上本地使用RStudio (上周刚刚安装)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-18 18:02:30

adj_w更大,因为cbind添加了列名。把它移开,你就会回到正确的尺寸。

代码语言:javascript
复制
head(adj_w)
#                 w
# [1,] 1 2 1.189969
# [2,] 1 3 1.100843
# [3,] 1 4 0.805436
# [4,] 1 5 1.001632
# [5,] 2 1 1.189969
# [6,] 2 3 1.265916

object.size(adj_w)
# 1016 bytes

attributes(adj_w)
# $dim
# [1] 20  3
# 
# $dimnames
# $dimnames[[1]]
# NULL
# 
# $dimnames[[2]]
# [1] ""  ""  "w"
# 
# 

adj_w2 <- adj_w
dimnames(adj_w2) <- NULL
object.size(adj_w2)
# 680 bytes

为了避免自动添加列名,可以首先将向量转换为矩阵.

代码语言:javascript
复制
adj_w3 <- cbind(el, matrix(w))
object.size(adj_w3)
# 680 bytes

或者,...or将deparse.level = 0参数传递给cbind

代码语言:javascript
复制
adj_w4 <- cbind(el, w, deparse.level = 0)
object.size(adj_w4)
# 680 bytes
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43478421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档