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