【发布时间】:2010-12-22 14:41:04
【问题描述】:
好的,我实际上正在处理大量浮点矩阵的内存存储。这些矩阵存储统计数据,并且大多数时候,只有少数单元格包含非空值。
让我们考虑这个简单的问题。 一个项目随着时间的推移收集统计数据。这些统计信息存储在大约 30 个浮点条目的单行格式矩阵中。但是对于一个项目,我们也有不同类型的统计数据。那么对于一个item,我们可以定义这个简单的结构:
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 开销? (对于 100 万个项目和 4 种统计信息,我们有大约 400 万次 malloc 操作,不考虑 std::map 插入开销......)
【问题讨论】:
标签: c++ optimization memory-management matrix