5

こんばんは、

前述のデータ(エッジリストまたはpajek形式)を分析しようとしています。最初に考えたのは、igraphパッケージを使用したRプロジェクトでした。しかし、メモリ制限(6GB)ではうまくいきません。128GBのPCでデータを処理できますか?RAMにグラフ全体を必要としない代替手段はありますか?

前もって感謝します。

PS:私はいくつかのプログラムを見つけましたが、この問題についていくつかのプロ(ええ、それはあなたです)の意見を聞きたいです。

4

1 に答える 1

6

次数の分布のみが必要な場合は、グラフパッケージはまったく必要ない可能性があります。私はbigtablulateパッケージをお勧めします

  1. RAMに制限されないように、Rオブジェクトはファイルでバックアップされます
  2. 次を使用して次数の計算を並列化できますforeach

詳細については、彼らのウェブサイトをチェックしてください。このアプローチの簡単な例を示すために、最初に、100万ノードのうち100万エッジを含むエッジリストを使用した例を作成しましょう。

set.seed(1)
N <- 1e6
M <- 1e6
edgelist <- cbind(sample(1:N,M,replace=TRUE),
                  sample(1:N,M,replace=TRUE))
colnames(edgelist) <- c("sender","receiver")
write.table(edgelist,file="edgelist-small.csv",sep=",",
            row.names=FALSE,col.names=FALSE)

次に、このファイルを10回連結して、例を少し大きくします。

system("
for i in $(seq 1 10) 
do 
  cat edgelist-small.csv >> edgelist.csv 
done")

次に、bigtabulateパッケージをロードし、エッジリストを使用してテキストファイルを読み込みます。このコマンドread.big.matrix()は、Rでファイルバックアップオブジェクトを作成します。

library(bigtabulate)
x <- read.big.matrix("edgelist.csv", header = FALSE, 
                     type = "integer",sep = ",", 
                     backingfile = "edgelist.bin", 
                     descriptor = "edgelist.desc")
nrow(x)  # 1e7 as expected

bigtable()最初の列を使用して、アウトディグリーを計算できます。

outdegree <- bigtable(x,1)
head(outdegree)

テーブルが期待どおりに機能していることを確認するための迅速な健全性チェック:

# Check table worked as expected for first "node"
j <- as.numeric(names(outdegree[1]))  # get name of first node
all.equal(as.numeric(outdegree[1]),   # outdegree's answer
          sum(x[,1]==j))              # manual outdegree count

学位を取得するには、を実行しますbigtable(x,2)

于 2012-03-11T07:56:44.303 に答える