Supongamos que tengo un gran gráfico no ponderado, no ponderado (que comienza en cientos de millones de vértices, ~ 10 aristas por vértice), no distribuido y procesado solo por un solo subproceso y que deseo hacer búsquedas amplias en él . Espero que estén vinculados a E/S, por lo tanto, necesito un diseño de página de disco bueno para BFS, el espacio en disco no es un problema. Las búsquedas pueden comenzar en cada vértice con la misma probabilidad. Intuitivamente eso significa minimizar el número de bordes entre vértices en diferentes páginas de disco, que es un problema de partición de gráfico.¿Guardando gráficos muy grandes en algoritmos de partición de gráficos de disco/transmisión?
El gráfico en sí parece un espagueti, piense en un conjunto aleatorio de puntos interconectados al azar, con algunos sesgos hacia los bordes más cortos.
El problema es, ¿cómo una partición grafica así de grande? Los particionadores de gráficos disponibles que he encontrado funcionan con gráficos que se ajustan solo a la memoria. No pude encontrar descripciones ni implementaciones de ningún algoritmo de partición de gráficos de transmisión.
O, tal vez hay una alternativa al gráfico de particionamiento para obtener un diseño de disco que funciona bien con BFS?
Ahora como una aproximación utilizo el hecho de que los vértices tienen coordenadas espaciales adjuntas a ellos y pongo los vértices en el disco en el orden de clasificación de Hilbert. De esta forma, los vértices espacialmente cercanos aterrizan en la misma página, pero la presencia o ausencia de borde entre ellos se ignora por completo. ¿Puedo hacerlo mejor?
Como alternativa, puedo dividir el gráfico en partes utilizando el orden de clasificación de Hilbert para los vértices, particionar los subgrafos, coserlos hacia atrás y aceptar particiones pobres en las costuras.
Algunas cosas que han estudiado ya:
- How to store a large directed unweighted graph with billions of nodes and vertices
- http://neo4j.org/ - me encontré con cero información sobre cómo lo hace el gráfico trazado en el disco
implementaciones de partición (a menos que esté equivocado, todos ellos deben ajustar el gráfico en la 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: información sobre cómo los gráficos se parece y que BFS puede comenzar por todas partes. EDITAR: idea en los subgrafos de particionamiento
Gracias por una respuesta detallada con ideas interesantes. Voy a probar el enfoque de vecindario, sin embargo, me pregunto si podré obtener mucho de él, porque la topología de gráficos es bastante "hostil" en mi caso. En cualquier caso, debería ser una mejora con respecto a mi enfoque actual de tipo Hilbert. –
Si la topología es demasiado hostil, no hay mucho que se pueda hacer: los enlaces básicamente lo llevan a un lugar al azar en los datos, y ninguna búsqueda inteligente puede ayudar. Mejor solo tener una buena forma de buscar ese lugar en el disco/en el archivo. O bien, si las consultas tienden a repetirse, piense en el almacenamiento en caché de los resultados anteriores. –