2017-04-18 8 views
1

私は大きな(密な)ネットワークマトリックスを取ってedgelistに変換しています。それでも、私がそうするとき、Rに割り当てられたメモリは狂っているようです。私の場合、12MBの行列(1259×1259)があり、edgelist(i、j、w)に変換すると71MBのメモリが必要になります。私は操作を実行するためにigraphパッケージを使用していますが、私はそれがそれに関連しているとは思いません。 ここでは、作成したデータで何をやっているのですか。cbindを使ったRのメモリ割り当て

私のデータはこのように見えるので、私は行列を対称で対角0にしましたが、私はこの問題については重要ではないと思います。 は、ここで私はIGRAPH使用:

# using igraph here 
adj <- graph.adjacency(as.matrix(A),weighted=TRUE) 
object.size(A) # 400 bytes 
object.size(adj) # 2336 bytes 

私はIGRAPHの影響調整後のオブジェクトが大きくなることを取得します。それは問題ではありません。

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バイトですが、私の(より大きな)データでは12MBから71MBです。

参考:MacBook Proにローカルで最新バージョンのRStudioを使用しています(先週すべてをインストールしたばかりです)。

答えて

3

adj_wは、cbindに列名が追加されているため大きいです。それを取り除くと正しいサイズに戻ります。

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 

は...あなたが最初の行列に、あなたのベクトルを変換することができ、

adj_w3 <- cbind(el, matrix(w)) 
object.size(adj_w3) 
# 680 bytes 

を自動カラム名の追加を避ける...または、その代わりに、cbinddeparse.level = 0引数を渡すには。

adj_w4 <- cbind(el, w, deparse.level = 0) 
object.size(adj_w4) 
# 680 bytes 
+0

あなたは技術的な部分に答えました。私はまた、間違った論理的仮定をしていました。私の考えでは、Aとadj_wは同じネットワークを表しているので、同じサイズでなければなりませんが、Aは400 bです。adj_w(調整しても)は680 bです。なぜそんなに大きい?私が作った間違いは、インデックス作成を保存しなければならないということでした。 Aでは、各1:N次元は暗黙のうちに格納されていませんが、adj_wの最初の2つの列にこれらの索引が格納され、記憶域のサイズはほぼ3倍になります。 –