Załóżmy, że mam bardzo duży, nieukierunkowany, nieważony wykres (rozpoczynający się od setek milionów wierzchołków, ~ 10 krawędzi na wierzchołek), nierozdzielony i przetwarzany tylko przez jeden wątek i że chcę wykonać w nim wiele wyszukiwań . Oczekuję, że będą one powiązane z I/O, więc potrzebuję układu strony dysku dobrej dla BFS, miejsce na dysku nie jest problemem. Wyszukiwanie może rozpocząć się na każdym wierzchołku z równym prawdopodobieństwem. Intuicyjnie oznacza to zmniejszenie liczby krawędzi między wierzchołkami na różnych stronach dysku, co jest problemem z partycjonowaniem wykresu.Przechowywanie bardzo dużych wykresów na algorytmach partycjonowania wykresów na dysku/strumieniu?
Sam wykres wygląda jak spaghetti, pomyśl o losowym zestawie losowo połączonych punktów, z pewną tendencją do krótszych krawędzi.
Problem polega na tym, że jeden podział wykresu jest tak duży? Dostępne graficzne partycje, które znalazłem, działają z wykresami pasującymi tylko do pamięci. Nie mogłem znaleźć żadnych opisów ani implementacji algorytmów partycjonowania wykresów strumieniowych.
OR, może jest alternatywa dla wykresu partycjonowania, aby uzyskać układ dysku, który działa dobrze z BFS?
W tej chwili używam faktu, że wierzchołki mają współrzędne przestrzenne z nimi związane i umieszczają wierzchołki na dysku w porządku sortowania Hilberta. W ten sposób przestrzenne wierzchołki lądują na tej samej stronie, ale obecność lub brak krawędzi między nimi jest całkowicie ignorowany. Czy mogę zrobić lepiej?
Alternatywnie, mogę podzielić wykres na części za pomocą porządku sortowania Hilberta dla wierzchołków, podzielić podgramy, zszyć je i zaakceptować słabe partycje na szwach.
Niektóre rzeczy mam spojrzał na już:
- How to store a large directed unweighted graph with billions of nodes and vertices
- http://neo4j.org/ - Znalazłem informacje o zerowej jak to zrobić wykres układ na dysku
implementacje działowe (chyba, że jestem mylone, wszystkie z nich muszą pasować do wykresu):
- 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: Informacje o tym, jak to wygląda i wykresy, które można uruchomić BFS wszędzie. EDYCJA: pomysł na podział subgraphs
Dzięki za szczegółową odpowiedź z interesującymi pomysłami. Wypróbuję podejście sąsiedzkie, ale zastanawiam się, czy będę w stanie uzyskać z tego wiele, ponieważ topologia wykresów jest raczej "wroga" w moim przypadku. W każdym razie, powinien być ulepszenie w stosunku do mojego obecnego podejścia typu Hilbert. –
Jeśli topologia jest zbyt nieprzyjazna, nie można wiele zrobić: linki prowadzą do losowego miejsca w danych i nie pomaga inteligentne stronicowanie. Lepiej po prostu mieć dobry sposób wyszukiwania tego miejsca na dysku/w pliku. Lub, jeśli zapytania mają tendencję do powtarzania, pomyśl o buforowaniu poprzednich wyników. –