好的,我实际上正在处理大量浮点矩阵的内存存储。这些矩阵存储统计数据,大多数情况下,只有少数单元格包含非空值。
让我们考虑一下这个简单的问题。 项目随时间收集统计信息。这些统计信息存储在大约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开销? (对于一百万个项目和四种统计数据,我们有大约400万个malloc操作,没有考虑到std :: map插入开销...)
答案 0 :(得分:1)
也许SparseLib ++可能是您感兴趣的东西。看看它是否符合您的需求:http://math.nist.gov/sparselib++/
SparseLib ++是一个C ++类库 有效的稀疏矩阵计算 跨越各种计算 平台。