Лучший способ хранить данные в хеше для гибких вычислений типа «сводная таблица» - PullRequest
1 голос
/ 17 апреля 2011

У меня есть набор данных со следующими полями.

имя хоста, модель, местоположение, номер порта, активирован ?, вверх?

Я бы преобразовал их в хэш-структуру (возможно, аналогичную приведенной ниже)

my %switches = (
    a => {
        "hostname" => "SwitchA",
        "model" => "3750",
        "location" => "Building A"
        "total_ports" => 48,
        "configured_ports" => 30,
        "used_ports" => 24,
    },
    b => {
        "hostname" => "SwitchB",
        "model" => "3560",
        "location" => "Building B"
        "total_ports" => 48,
        "configured_ports" => 36,
        "used_ports" => 20,
    },        
},
);

В конце я хочу сгенерировать статистику, такую ​​как: количество переключателей на здание, количество переключателей каждой модели на здание. Общее количество.количество работающих портов в каждом здании

Статистика может не ограничиваться только строительством, может даже основываться на коммутаторах (т. е. количество используемых коммутаторов 95% и т. д.).При заданной структуре данных, как я могу перечислить эти счетчики?

И наоборот, есть ли лучший способ для хранения моих данных?Я могу вспомнить хотя бы один формат:

 <while iterating over records>
 {
 hash{$location}->{$model_name}->count++;
 if ($State eq 'Active') {hash{$location}->{up_ports}->count++};

Что может быть лучше для этого?Если я выбрал первый формат (где вся информация внутри хэша не повреждена), как я могу объединить данные для получения различной статистики?(некоторые примеры фрагментов кода будут очень полезны!)

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Если вы хотите запрашивать гибкость, стратегия «базы данных» часто бывает хорошей.Вы можете сделать это напрямую, поместив данные в нечто вроде SQLite .При таком подходе вы сможете выполнять самые разные запросы к данным без особого кодирования.

В качестве альтернативы, если вы ищете чистый Perl-подход, способ аппроксимации базы данныхтаблица - это использование массива массивов или, что еще лучше для читабельности кода, массива хэшей.Внешний массив похож на таблицу базы данных.Каждый хэш в этом массиве похож на запись в базе данных.Ваши запросы на основе Perl в конечном итоге будут выглядеть так:

my @query_result = grep {
    $_->{foo} == 1234 and
    $_->{bar} eq 'fubb'
} @data;

Если у вас столько строк, что производительность запросов становится узким местом, вы можете создавать свои собственные индексы, используя хеш.

%data_by_switch = (
    'SwitchA' => [0, 4, 13, ...],  # Subscripts to @data.
    'SwitchB' => [1, 12, ...],
    ...
);

Мой ответ основан на ответах, которые я получил на на этот вопрос , который имеет некоторые сходства с вашим вопросом.

1 голос
/ 17 апреля 2011

Насколько я вижу, у вас есть список кортежей, для обсуждения достаточно рассмотреть объекты с 2 атрибутами, например, location и ports_used.Так, например:

(["locA", 23], ["locB", 42], ["locA", 13])  # just the values as tuples, no keys

И вы хотите получить такой результат, как:

("locA" => 36, "locB" => 42)

Это правильно?Если да, то с какой проблемой вы столкнулись?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...