[英]Querying out of memory 60gb tsv's in R on the first column, which database/method?
[英]Social graph analysis. 60GB and 100 million nodes
晚上好,
我正在尝试分析上述数据(edgelist或pajek格式)。 首先想到的是带有igraph软件包的R项目。 但是内存限制(6GB)不能解决问题。 一台128GB的PC能够处理数据吗? 是否有不需要在RAM中整个图形的替代方案?
提前致谢。
PS:我找到了几个程序,但是我想听听一些赞成(是的,就是你)对此事的意见。
如果只需要度数分布,则可能根本不需要图形包。 我推荐bigtablulate软件包,以便
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)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.