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);

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


Ответы (0 шт):