У меня очень большая сеть, основанная на уникальных вершинах 100K и ребрах 500M (примечание: все ребра имеют расстояние 1 (двоичное) и ненаправленные).
Мне нужно создать матрицу 100K на 100K самого короткогорасстояния между каждой парой вершин.
Я использую igraph
и команду distances()
, которая создает именно то, что я хочу, с чем-то вроде этого:
distance_mat <- distances(network, v=V(network), to=V(network), weights=NA)
Однако, это становится оченьмедленная работа с сетью такого масштаба - по текущим оценкам мой код требует> 10 дней для завершения на i7 Mac с частотой 2,5 ГГц и 16 ГБ ОЗУ.
Кто-нибудь оптимизировал процедуру, чтобы сделать что-то подобное с таким большимсеть или есть идеи, как это ускорить?
Вот пример кода для построения большой (но не полноразмерной) сети, на котором можно попрактиковаться, если это поможет:
require(igraph)
n_id <- 100000
n_connect <- 100000000
id1 <- sample(1:n_id,n_connect,replace=T)
id2 <- sample(1:n_id,n_connect,replace=T)
nbr <- rep(1,n_connect)
idall <- unique(c(id1,id2))
df <- as.data.frame(cbind(id1,id2,nbr))
network <- graph_from_data_frame(d=df, vertices=idall, directed=F)
Sys.time()
dist_df <- distances(network, v=V(network)[1:1000], to=V(network)[1:1000], weights=NA)
Sys.time()