Puoi poter utilizzare una specie di tecnica di clustering (ad es. MapReduce), ma con questa piccola dimensione di dati, assolutamente non è necessario utilizzare il clustering .
Con questa dimensione di dati, dovresti essere in grado di farlo tutto in memoria. Supponendo un approccio ingenuo:
- 15 mb - Punteggi della precedente iterazione (4.000.000 di 32 bit in virgola mobile)
- 15 mb - Punteggi dalla prossima iterazione (4.000.000 float 32 bit)
- 190 mb - Web Graph, assumendo una struttura grafica naive di {num outlinks, outlink 1, outlink 2, ... outlink n} fatti di 32 bit ints, il grafico si adatterebbe in 45.000.000 * 32 bit + 4.000.000 * 32 bit,
Circa 250 mb. L'approccio ingenuo sarebbe simile a questo:
N <- size of graph
c <- dampening factor
source_scores[N] <- array of floats, initalised to 1 / N.
dest_scores[N] <- array of floats
repeat until convergence {
for all n up to N { dest_scores[n] = 0 }
for all source,dest links {
dest_scores[dest] += source_scores[source] / num_outlinks of source
}
for all n up to N {
dest_scores[n] = c * dest_scores[n] + (1 - c)/N
}
copy dest_scores to source_scores
}
"Ma ho anche questo altro grafico che WONT si adatta alla memoria!"
Per il calcolo del pagerank in memoria su qualsiasi grafico di dimensione, controlla questo documento . Descrive una tecnica multi-pass (per singola pagina di iterazione) che consente di completare il pagerank in memoria, assumendo l'accesso al flusso al grafico e ai punteggi delle iterazioni precedenti.
Richiede di mantenere i punteggi correnti in memoria. Con 4.000.000 di nodi e supponendo float a 32 bit, si osservano circa 15 megabyte di dati, oltre a qualsiasi sovraccarico di array. Il tuo server da 48 GB andrà bene per questo (e andrà bene anche per l'approccio ingenuo, vedi sotto).
Avrai una bella piccola rappresentazione del grafico che ti consentirà di leggerlo in uno stream. Poiché stai utilizzando Java, consulta il framework di compressione WebGraph . È descritto dettagliatamente in questo documento . Per un grafico di 118.000.000 di nodi e 1.000.000.000 di link, si cita una compressione di 3.08 bit per collegamento, il che è sorprendente.
Si noti che esiste anche un'implementazione C ++ del framework di compressione WebGraph disponibile a quel link, ma è MUCH SLOWER, principalmente perché è una parola per parola porta del codice Java, piuttosto che un'implementazione C ++ dell'algoritmo di compressione.
Utilizzando questo approccio, ho avuto il codice Java per pagerank che ha raggiunto la convergenza in poco meno di un'ora su un singolo desktop dell'era 2007 con 2 gig di ram, su un grafico Web di 80.000.000 di nodi. Il codice C ++ per lo stesso è durato circa due ore (a causa delle differenze di velocità nell'implementazione della compressione).
Fammi sapere se hai bisogno di aiuto.