【发布时间】:2021-11-24 01:45:47
【问题描述】:
我有一个igraph 网络图,其中包含 103,887 个节点和 4,795,466 个关系。
这可以构造为data.table 中的边缘列表,包含近 900 万行。
按照@chinsoon12 的回答here,我可以在这个网络中找到共同的邻居。请参阅下面的示例。
这对于较小的网络非常有效,但在我的用例中遇到了问题,因为合并导致超过 2^31 行。
问题:
- 是否有有效的替代方法来处理这个问题?
- 我可以拆分数据并逐步进行计算吗?结果将用于查询共同邻居。
示例 - 修改自 @chinsoon12 的答案:
library(data.table)
library(igraph)
set.seed(1234)
g <- random.graph.game(10, p=0.10)
adjSM <- as(get.adjacency(g), "dgTMatrix")
adjDT <- data.table(V1=adjSM@i+1, V2=adjSM@j+1)
res <- adjDT[adjDT, nomatch=0, on="V2", allow.cartesian=TRUE
][V1 < i.V1, .(Neighbours=paste(V2, collapse=",")),
by=c("V1","i.V1")][order(V1)]
res
V1 i.V1 Neighbours
1: 4 5 8
2: 4 10 8
3: 5 10 8
【问题讨论】:
-
我认为您可以检查您的机器支持的最大行数,即
.Machine$integer.max。在我的机器中,它是> log2(.Machine$integer.max) [1] 31,这意味着我的行数不能超过2^31... -
@ThomasIsCoding 这对我来说是一样的,但可能有一种巧妙的方法来处理这个问题,对吧?
-
你的意思是处理我的解决方案的大小限制问题还是速度问题?如果您确实有超过 2^31 行,我认为无法解决大小限制问题,但第二个问题是可能的。
-
@ThomasIsCoding 大小限制问题对我来说是一样的。虽然我喜欢你的回答,但你的方法的性能问题禁止它在现实生活中使用。
-
好的,我明白你的意思了。我将看看我的方法可能的改进。
标签: r merge data.table igraph