5

晚上好,

我正在尝试分析上述数据(edgelist 或 pajek 格式)。首先想到的是带有 igraph 包的 R 项目。但是内存限制(6GB)不会解决问题。128GB 的​​ PC 能否处理数据?是否有任何替代方案不需要 RAM 中的整个图?

提前致谢。

PS:我找到了几个程序,但我想听听一些专业人士(是的,就是你)对此事的看法。

4

1 回答 1

6

如果您只想要学位分布,您可能根本不需要图形包。我推荐bigtablulate 包,这样

  1. 您的 R 对象是文件支持的,因此您不受 RAM 的限制
  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包并使用我们的 edgelist 读入文本文件。该命令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 回答