Уменьшение детализации набора данных

#java #algorithm #aggregate

#java #алгоритм #агрегировать

Вопрос:

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

 #    Students    Year    Subject    Teacher
1    30          7       Math       Mrs Smith
2    28          7       Math       Mr Cork
3    20          8       Math       Mrs Smith
4    20          8       English    Mr White
5    18          8       English    Mr Book
6    10          12      Math       Mrs Jones
  

К сожалению, в моем кэше нет функции GROUP BY или аналогичных функций — поэтому, когда я захочу взглянуть на вещи на более высоком уровне агрегирования, мне придется «свернуть» данные самостоятельно. Например, если я объединю учащихся по годам, подлежащим, вышеупомянутые данные будут выглядеть следующим образом:

 #    Students    Year    Subject
1    58          7       Math
2    20          8       Math 
3    38          8       English
4    10          12      Math
  

Таким образом, мой вопрос заключается в следующем — как бы мне лучше всего сделать это на Java? Теоретически я мог бы извлекать десятки тысяч объектов из этого кэша, поэтому возможность быстрого «свертывания» этих коллекций может стать очень важной.

Моей первоначальной (возможно, наивной) мыслью было бы сделать что-то в следующих строках;

Пока я не исчерпаю список записей:

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

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

«Получить новый кеш», боюсь, не вариант 🙂

-Дэйв.

Комментарии:

1. Я думаю, что это одна из основных причин, по которой базы данных были invented…so существует огромное количество литературы на эту тему. Я думаю, вам понадобится индекс (или hashmap) для каждого «запроса», который вы хотите выполнить в своем кэше.

Ответ №1:

Ваша «первоначальная мысль» — неплохой подход. Единственным способом улучшить это было бы иметь индекс для полей, по которым вы агрегируете (год и тема). (Это в основном то, что делает СУБД, когда вы определяете индекс.) Тогда ваш алгоритм можно было бы переделать как перебирающий все значения индекса; вам не пришлось бы проверять хэш результатов для каждой записи.

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