Ho questo vecchio sistema batch. Lo scheduler memorizza tutti i nodi computazionali in un unico grande array. Ora va bene per la maggior parte, perché la maggior parte delle query può essere risolta filtrando per i nodi che soddisfano la query.Struttura dati per la selezione di gruppi di macchine
Il problema che ho ora è che oltre a alcune proprietà di base (numero di cpus, memoria, sistema operativo), ci sono anche queste strane proprietà di raggruppamento (città, infiniband, rete zero).
Ora il problema con questi è che quando un utente richiede nodi con infiniband non posso dargli solo dei nodi, ma devo dargli dei nodi collegati a uno switch infiniband, così i nodi possono effettivamente comunicare usando infiniband.
Questo è ancora OK, quando l'utente richiede una sola di tali proprietà (posso solo partizionare l'array per ciascuna delle proprietà e quindi provare a selezionare i nodi in ogni partizione separatamente).
Il problema si presenta con la combinazione di più di tali proprietà, poiché in tal caso dovrei generare tutte le combinazioni di sottoinsiemi (partizioni dell'array principale).
La cosa buona è che la maggior parte delle proprietà si trova in una sottosistema o in una relazione di equivalenza (ha senso per le macchine su un interruttore infiniband essere in una città). Ma questo purtroppo non è assolutamente vero.
Esiste una buona struttura dati per archiviare questo tipo di elemento semi-gerarchico per lo più ad albero?
EDIT: esempio
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
utenti richiedono:
2x node with infiniband and networkfs
L'uscita desiderato sarebbe: (node1, node2)
o (node5,node6)
o (node7,node8)
.
In una buona situazione questo esempio non si verificherebbe, ma in alcuni casi abbiamo effettivamente queste strane connessioni tra siti. Se i nodi in city2
si troverebbero tutti su infiniband switch04
, sarebbe facile. Purtroppo ora devo generare gruppi di nodi, che hanno lo stesso switch infiniband e lo stesso filesystem di rete.
In realtà il problema è molto più complicato, dal momento che gli utenti non richiedono interi nodi e le proprietà sono molte.
Modifica: aggiunto l'output desiderato per la query.
Forse, se si dà un esempio insieme più concreto, sarà più facile per descrivere il problema – Peaches491
@ Peaches491 meglio? –
E non è possibile utilizzare un DB in memoria che gestisce già questo tipo di complessità? Immagino che tu abbia già guardato il contenitore multi_index da boost e abbia deciso di non tirarne fuori qualcosa? – Nim