Mam ten stary system wsadowy. Program planujący przechowuje wszystkie węzły obliczeniowe w jednej dużej tablicy. Teraz jest to w porządku, ponieważ większość zapytań można rozwiązać przez filtrowanie dla węzłów, które spełniają zapytanie.Struktura danych do wyboru grup maszyn
Problemem, który mam teraz, jest to, że oprócz pewnych podstawowych właściwości (liczba procesorów, pamięci, systemu operacyjnego), istnieją również te dziwne właściwości grupowania (miasto, infiniband, zarysowanie sieci).
Teraz problem polega na tym, że gdy użytkownik żąda węzłów z infiniband, nie mogę po prostu dać mu żadnych węzłów, ale muszę dać mu węzły podłączone do jednego przełącznika infiniband, więc węzły mogą rzeczywiście komunikować się za pomocą infiniband.
To wciąż jest OK, gdy użytkownik żąda tylko jednej takiej właściwości (mogę po prostu podzielić tablicę dla każdej właściwości, a następnie spróbować wybrać węzły w każdej partycji oddzielnie).
Problem polega na łączeniu wielu takich właściwości, ponieważ wtedy musiałbym wygenerować całą kombinację podzbiorów (partycji głównej tablicy).
Dobrą rzeczą jest to, że większość właściwości znajduje się w relacji podzestawu lub równoważności (to ma sens, aby maszyny znajdujące się na jednym przełączniku infiniband znajdowały się w jednym mieście). Ale to niestety nie jest ściśle prawdą.
Czy istnieje pewna dobra struktura danych do przechowywania tego rodzaju semi-hierarchicznych, głównie podobnych do drzewa rzeczy?
Edycja: Przykład
node1 : city=city1, infiniband=switch03, networkfs=server01
node2 : city=city1, infiniband=switch03, networkfs=server01
node3 : city=city1, infiniband=switch03
node4 : city=city1, infiniband=switch03
node5 : city=city2, infiniband=switch03, networkfs=server02
node6 : city=city2, infiniband=switch03, networkfs=server02
node7 : city=city2, infiniband=switch04, networkfs=server02
node8 : city=city2, infiniband=switch04, networkfs=server02
Użytkownicy żądają:
2x node with infiniband and networkfs
pożądany wynik byłby: (node1, node2)
lub (node5,node6)
lub (node7,node8)
.
W dobrej sytuacji ten przykład nie miałby miejsca, ale w niektórych przypadkach mamy te dziwne połączenia między lokacjami. Jeśli węzły w city2
będą wszystkie na infiniband switch04
, będzie to łatwe. Niestety teraz muszę generować grupy węzłów, które mają ten sam przełącznik infiniband i ten sam sieciowy system plików.
W rzeczywistości problem jest znacznie bardziej skomplikowany, ponieważ użytkownicy nie żądają całych węzłów, a ich właściwości są liczne.
Edytuj: dodano pożądane wyjście dla zapytania.
Być może, jeśli dać bardziej konkretny przykład zestawu, łatwiej będzie opisać problem – Peaches491
@ Peaches491 lepiej? –
I nie można użyć DB w pamięci, który już obsługuje tego rodzaju złożoność? Sądzę, że już spojrzałeś na pojemnik multi_index z boost i zdecydowałeś się nie wywracać czegoś z tego? – Nim