c++: накопление данных в гистограмме (оптимизация по памяти и произвольности)
Стоит следующая задача:
Заполняется гистограмма, при этом кол-во каналов произвольно (заранее неизвестно), т.е. выполняется операция
hist.add(channel_id, value)
требуется выполнять данную операцию быстро и при этом, чтобы гистограмма потребляла не очень много памяти
Когда стояла задача только в скорости заполнения гистограммы, то делал следующим образом:
using hist_t = std::map<int, int>;
hist_t hist;
// найти информацию о канале
hist_t::iterator point = hist.find(channel_id);
// если точка найдена - обновить данные иначе добавить новую точку
if (point != hist.end())
point->second += value;
else
hist.insert(hist_pr(channel_id, value));
Затем вместо std::map стал использовать std::unordered_map.
Но когда появилась надобность использовать (заполнять) очень много гистограмм с большим кол-вом каналов то стал вопрос и используемой памяти.
Подскажите, можно ли как-то и рыбку съесть и на лошадке покататься? Т.е. чтобы гистограмма заполнялась быстро, но при этом и память расходовалась умеренно (все таки map и unordered_map ее используют излишне)
P.S.
как понимаю в качестве одной из оптимизаций можно вместо
hist.insert(hist_pr(channel_id, value));
использовать
hist.emplace(channel_id, value);
что должно при создании нового канала чуть-чуть помочь (хотя это капля в море, поскольку чаще всего данные добавляются в уже существующие каналы)