我目前使用活动监视器,但是这会产生严重的不一致性。我有一个运行的程序,建立和存储一个10维GSL矢量的60×100,000阵列双精度,另一个6×60阵列16,807维GSL矢量。
我用C++编写代码,为了方便起见,我正在使用GSL库。
GSL向量本质上是一个双精度数据数组和指针,所以我认为应该准确地用双精度组件来度量它们的使用。
现在,根据我的计算,我应该存储大约500 MB的数据(每双8字节)。然而,我的Macos活动监视器告诉我,我正在存储1.4GB的“真实”内存。现在,这可能是一种非常不准确的测量内存使用的方法,但在预测我的机器何时会从使用RAM切换到使用交换时,这并不是不准确的,而且会变得非常慢!例如,当我将第一个数组大小增加到60x400k时,内存就用完了,一切都停止了。
那么,是我的数学错了,还是我的计算机估计它存储了多少数据的方式出了问题?
编辑:还是我存储基于指针的数据的方式混淆了分配程序对存储需求的大规模过度补偿?
编辑2:数据存储在stl::vector< stl::vector<gsl::gsl_vector * > >结构中。我读到特征不使用动态内存分配:这会导致内存管理的实质性改进吗?
发布于 2013-12-12 08:00:12
您正在创建60万std::vectors。这是很大的开销。这些向量中的每一个不仅仅是一个数组,还有指针、大小、容量、对齐等开销。另外,我怀疑你在堆中分配了GSL向量?
特征可以部分地解决您的问题,因为它具有矩阵类的静态专门化。但是,您应该真正考虑使用适当的3d连续存储数组/张量对象。
https://stackoverflow.com/questions/20537195
复制相似问题