Работа с огромным количеством матриц поплавков - PullRequest
0 голосов
/ 22 декабря 2010

Хорошо, я на самом деле работаю с хранением в памяти огромного количества матриц поплавков.Эти матрицы хранят статистические данные, и в большинстве случаев только несколько ячеек содержат ненулевое значение.

Давайте рассмотрим эту простую проблему.Элемент собирает статистику с течением времени.Эти статистические данные хранятся в матрице однострочного формата из примерно 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 ...)

1 Ответ

1 голос
/ 22 декабря 2010

Возможно, SparseLib ++ может быть чем-то, что вас интересует. Посмотрите, подходит ли оно вашим потребностям: http://math.nist.gov/sparselib++/

SparseLib ++ - это библиотека классов C ++ для эффективные разреженные матричные вычисления через различные вычислительные платформы.

...