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