我的内存不一致吗?苹果系统

时间:2013-12-12 07:13:26

标签: c++ memory-management vector gsl

我目前使用Activity监视器,但是这会产生严重的不一致。我有一个正在运行的程序,它以双精度构建和存储一个60 x 100,000的10维GSL向量数组,以及另一个包含16,807维GSL向量的6 x 60数组。

我用C ++编写代码,我只是为了方便而使用GSL库。

GSL向量本质上是一个双精度数据和一个指针的数组,因此我认为根据双精度分量测量它们的用法应该是准确的。

现在,根据我的计算,我应该存储大约500 MB的数据(每双8字节)。但是,我的Macos Activity监视器告诉我,我正在存储1.4 GB的“真实”内存。现在,这可能是一种非常不准确的方法来衡量内存使用情况,但是在预测我的机器何时从使用RAM切换到使用交换并且变得非常慢时并不准确!例如,当我将第一个数组大小增加到60 x 400k时,我的内存耗尽,一切都停止了。

那么我的数学错误,或者我的计算机估算它存储的数据的方式是否出现问题?

编辑:或者它是关于我存储基于指针的数据的方式,这会使分配器混淆大量过度补偿存储需求?

编辑2:数据存储在stl::vector< stl::vector<gsl::gsl_vector * > >个结构中。我读到Eigen不使用动态内存分配:这是否会导致内存管理的实质性改进?

1 个答案:

答案 0 :(得分:1)

您正在创建600,000 std::vectors。这是很多开销。这些向量中的每一个都不仅仅是一个数组 - 指针,大小,容量,对齐等都有开销。另外我怀疑你在堆上分配你的GSL向量?

Eigen可以部分解决您的问题,因为它具有Matrix类的静态特化。但是,您应该考虑使用适当的3d连续存储阵列/张量对象。