Supponiamo di avere un grande grafo non orientato, non ponderato (a partire da centinaia di milioni di vertici, ~ 10 spigoli per vertice), non distribuito ed elaborato solo da un singolo thread e che voglio fare ricerche di ampiezza su di esso . Mi aspetto che siano legati all'I/O, quindi ho bisogno di un layout di pagina del disco buono per BFS, lo spazio su disco non è un problema. Le ricerche possono iniziare su ogni vertice con uguale probabilità. Intuitivamente ciò significa minimizzare il numero di spigoli tra i vertici su diverse pagine del disco, che è un problema di partizionamento del grafico.Archiviare grafici molto grandi su algoritmi di partizionamento del grafico su disco/streaming?
Il grafico stesso sembra uno spaghetto, pensiamo a un insieme casuale di punti casualmente interconnessi, con qualche pregiudizio verso i bordi più corti.
Il problema è, in che modo un grafico di partizione è così grande? I partitori di grafici disponibili che ho trovato funzionano con grafici che si adattano solo alla memoria. Non sono riuscito a trovare descrizioni o implementazioni di algoritmi di partizionamento di grafici in streaming.
O, forse c'è un'alternativa al grafico di partizionamento per ottenere un layout del disco che funzioni bene con BFS?
In questo momento, come approssimazione, utilizzo il fatto che i vertici hanno coordinate spaziali ad essi collegate e posizionano i vertici su disco in ordine di Hilbert. In questo modo i vertici spazialmente vicini si posizionano sulla stessa pagina, ma la presenza o l'assenza di spigoli tra di essi viene completamente ignorata. Posso fare di meglio?
In alternativa, posso dividere il grafico in pezzi usando l'ordine di ordinamento Hilbert per i vertici, suddividere i sottografi, ricucirli e accettare un partizionamento insufficiente sulle cuciture.
Alcune cose che hanno esaminato già:
- How to store a large directed unweighted graph with billions of nodes and vertices
- http://neo4j.org/ - ho trovato informazioni a zero su come fa a fare il grafico di layout su disco
implementazioni partizionamento (a meno che io sono errato, tutti devono inserire il grafico nella memoria):
- http://glaros.dtc.umn.edu/gkhome/views/metis
- http://www.sandia.gov/~bahendr/chaco.html
- http://staffweb.cms.gre.ac.uk/~c.walshaw/jostle/
- http://www.cerfacs.fr/algor/Softs/MESHPART/
EDIT: informazioni su come i grafici assomiglia e che BFS può iniziare ovunque. MODIFICA: idea sul partizionamento sottotitoli
Grazie per una risposta dettagliata con idee interessanti. Proverò l'approccio del vicinato, tuttavia mi chiedo se riuscirò a tirarne fuori molto, perché la topologia grafica è piuttosto "ostile" nel mio caso. In ogni caso, dovrebbe essere un miglioramento rispetto al mio attuale approccio di tipo Hilbert. –
Se la topologia è troppo ostile, non c'è molto che possa essere fatto: i collegamenti in pratica ti portano in un punto casuale nei dati, e nessuna paginazione intelligente può essere d'aiuto. Meglio avere solo un buon modo per cercare quel punto sul disco/nel file. Oppure, se le query tendono a essere ripetute, pensa a memorizzare nella cache i risultati precedenti. –