2012-03-10 10 views
5

Dobry wieczór,Analiza wykresu społecznego. 60 GB i 100 milionów węzłów

Próbuję przeanalizować wymienione dane (format edgelist lub pajek). Pierwsza myśl to projekt typu R z pakietem igraph. Ale ograniczenia pamięci (6 GB) nie będą wystarczające. Czy 128 GB PC będzie w stanie obsłużyć dane? Czy są jakieś alternatywy, które nie wymagają pełnego wykresu w pamięci RAM?

Z góry dziękuję.

P.S: Znalazłem kilka programów, ale chciałbym usłyszeć pewne pro (tak, to ty) opinie w tej sprawie.

+1

Kiedy mówisz "analizuj", czy możesz dokładniej określić, co próbujesz zrobić? – ose

+0

Oczywiście. Chcę obliczyć stopnie (in, out, total), które wykorzystam do wykreślenia dystrybucji. Chcę móc przenosić węzły i krawędzie z dużego wykresu na mniejsze wykresy (procesy próbkowania), w których bardzo przydatne są add.vertices i add.edges z igraph. –

+0

Jaki jest format danych? Czy edgelista jest sam w sobie 60 gb? (Czy jest to plik tekstowy, w którym każdy wiersz zawiera dwie liczby reprezentujące nadawcę i odbiorcę pojedynczej krawędzi?) –

Odpowiedz

6

Jeśli chcesz tylko dystrybucji stopni, prawdopodobnie nie potrzebujesz w ogóle pakietu graficznego. Polecam bigtablulate package tak aby

  1. obiektami R są wspierane plik tak, że nie są ograniczone RAM
  2. można parallelize obliczeń stopni używając foreach

odjazdu their website więcej szczegółów . Aby dać szybki przykład tego podejścia, najpierw stwórzmy przykład z edgelistą obejmującą 1 milion krawędzi wśród 1 miliona węzłów.

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) 

Następnym razem łączę ten plik 10 razy, aby przykład był nieco większy.

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

Następnie załadować pakiet bigtabulate i czytać w pliku tekstowym z naszej edgelist. Komenda read.big.matrix() tworzy obiekt pliku oparciem w 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 

Możemy obliczyć krawędzi wychodzących za pomocą bigtable() na pierwszej kolumnie.

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

Szybka kontrola poprawności, aby upewnić się stół działa zgodnie z oczekiwaniami:

# 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 

Aby uzyskać indegree, zrób bigtable(x,2).

+0

Więc jeśli dobrze to zrobimy, przenosimy problem do obliczeń macierzy. Lubię to. Podaj przykład. –

+0

Wydaje się łatwe i skalowalne do obliczania stopnia. Czy radzi sobie z manipulacją wykresami? Dodawanie odejmowania itp.? Muszę przeczytać ich dokumentację. Dzięki za zamieszczenie Christophera. –

Powiązane problemy