Хорошо, я на самом деле работаю с хранением в памяти огромного количества матриц поплавков.Эти матрицы хранят статистические данные, и в большинстве случаев только несколько ячеек содержат ненулевое значение.
Давайте рассмотрим эту простую проблему.Элемент собирает статистику с течением времени.Эти статистические данные хранятся в матрице однострочного формата из примерно 30 записей с плавающей запятой.Но у нас также есть, для пункта, другой вид статистики.Затем для элемента мы можем определить эту простую структуру:
struct ItemStatistics
{
uint64_t item_id;
float * statistics_a;
...
float * statistics_z;
};
Пока приложение (сервер) работает, я собираю кучу статистических данных для тысяч элементов.Затем мы можем определить глобальную структуру, которая хранит статистику приложения для всех наших элементов в виде карты для быстрого доступа:
typedef std::map<uint64_t, ItemStatistics*> StatisticsDb; // item_id <-> statistics
Это наивное представление не эффективно для использования памяти, поскольку каждый statistics_x объектфиксированный размер массива около 30 записей.Поскольку в среднем собираются только 5 значений, матрицы в большинстве случаев заполнены на 10%, иногда меньше.
Существует ли эффективный способ хранения этих данных в памяти?
Есть лиспособ избежать издержек malloc для каждого распределения матрицы?(Для миллиона элементов и 4 видов статистики у нас около 4 миллионов операций с malloc без учета накладных расходов на вставку std :: map ...)