Структура данных для выбора групп машин

У меня есть старая пакетная система. Планировщик хранит все вычислительные узлы в одном большом массиве. По большей части это нормально, потому что большинство запросов можно решить путем фильтрации узлов, удовлетворяющих запросу.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что помимо некоторых основных свойств (количество процессоров, памяти, ОС) есть еще эти странные свойства группировки (город, бесконечная полоса пропускания, сетевая царапина).

Теперь проблема с ними заключается в том, что когда пользователь запрашивает узлы с infiniband, я не могу просто дать ему какие-либо узлы, но я должен предоставить ему узлы, подключенные к одному коммутатору infiniband, чтобы узлы могли фактически общаться с использованием infiniband.

Это по-прежнему нормально, когда пользователь запрашивает только одно такое свойство (я могу просто разбить массив на разделы для каждого из свойств, а затем попытаться выбрать узлы в каждом разделе отдельно).

Проблема возникает при объединении нескольких таких свойств, потому что тогда мне пришлось бы генерировать все комбинации подмножеств (разделов основного массива).

Хорошо то, что большинство свойств находятся в отношении подмножества или эквивалентности (имеет смысл, если машины на одном бесконечнополосном коммутаторе находятся в одном городе). Но это, к сожалению, не совсем верно.

Существует ли какая-нибудь хорошая структура данных для хранения такой полуиерархической, в основном древовидной структуры?

РЕДАКТИРОВАТЬ: пример

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

Запрос пользователя:

2x node with infiniband and networkfs

Желаемый вывод: (узел1, узел2)или (узел5,узел6)или (узел7 ,узел8).

В хорошей ситуации этот пример не случился бы, но в некоторых случаях у нас действительно есть эти странные межсайтовые соединения. Если бы все узлы в city2были бы на infiniband switch04, это было бы легко. К сожалению, теперь мне приходится генерировать группы узлов, которые имеют один и тот же коммутатор infiniband и одну и ту же сетевую файловую систему.

На самом деле проблема намного сложнее, так как пользователи не запрашивают целые узлы, а свойств много.

Изменить: добавлен желаемый вывод для запроса.

10
задан Let_Me_Be 26 June 2012 в 13:26
поделиться