2012-03-10 20 views
5

Buenas noches,Análisis de grafos sociales. 60 GB y 100 millones de nodos

Estoy tratando de analizar los datos mencionados anteriormente (formato edgelist o pajek). Primero pensé que era R-project con el paquete igraph. Pero las limitaciones de memoria (6GB) no funcionarán. ¿Una computadora de 128GB podrá manejar los datos? ¿Hay alguna alternativa que no requiera un gráfico completo en la memoria RAM?

Gracias de antemano.

P.S: He encontrado varios programas, pero me gustaría escuchar algunas opiniones profesionales (sí, esa es usted) sobre el asunto.

+1

Cuando dices "analizar", ¿puedes ser más específico en cuanto a lo que intentas hacer? – ose

+0

Por supuesto. Quiero calcular los grados (entrada, salida, total) que usaré para trazar distribuciones. Quiero poder mover nodos y bordes del gráfico grande a gráficos más pequeños (procesos de muestreo), donde add.vertices y add.edges del igraph son muy útiles. –

+0

¿Cuál es el formato de los datos? ¿Es el edgelist solo 60 gb? (es decir, ¿es un archivo de texto donde cada fila contiene dos números que representan el remitente y el destinatario de un solo borde?) –

Respuesta

6

Si solo desea distribuciones de títulos, es probable que no necesite un paquete de gráficos en absoluto. Recomiendo los bigtablulate package de modo que los

  1. sus objetos R están respaldados archivo de modo que usted no está limitado por la memoria RAM
  2. se puede paralelizar el cálculo grado usando foreach

Salida their website para más detalles . Para dar un ejemplo rápido de este enfoque, primero creemos un ejemplo con un edgelist que involucre 1 millón de bordes entre 1 millón de nodos.

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) 

I junto concatenar este archivo 10 veces para que el ejemplo sea un poco más grande.

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

A continuación se carga el paquete de bigtabulate y leer en el archivo de texto con nuestra edgelist. El comando read.big.matrix() crea un objeto de archivo respaldados en 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 

Podemos calcular los outdegrees utilizando bigtable() en la primera columna.

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

comprobación de validez rápida para asegurarse de que la tabla está funcionando como se esperaba:

# 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 

Para obtener grado de entrada, acaba de hacer bigtable(x,2).

+0

Entonces, si lo hago bien, estamos trasladando el problema al cálculo de matrices. Me gusta eso. Por favor, brinde un ejemplo. –

+0

Parece fácil y escalable para el cálculo de grados. ¿Puede manejar la manipulación de gráficos? ¿Agregar substracting, etc.? Debo leer su documentación. Gracias por publicar a Christopher. –

Cuestiones relacionadas