我有记忆不一致吗?苹果系统
Posted
技术标签:
【中文标题】我有记忆不一致吗?苹果系统【英文标题】:Do I have a memory inconcistency? Macos 【发布时间】:2013-12-12 07:13:25 【问题描述】:我目前使用活动监视器,但这会产生严重的不一致。我有一个正在运行的程序,它以双精度构建和存储一个 60 x 100,000 的 10 维 GSL 向量数组,以及另一个 16,807 维 GSL 向量的 6 x 60 数组。
我使用 C++ 编写代码,出于方便,我使用 GSL 库。
GSL 向量本质上是一个双精度数据数组和一个指针,因此我认为仅根据双精度分量来衡量它们的使用情况应该是准确的。
现在,根据我的计算,我应该存储大约 500 MB 的数据(每双 8 字节)。但是,我的 Macos 活动监视器告诉我,我正在存储 1.4 GB 的“真实”内存。现在,这可能是一种非常不准确的测量内存使用情况的方法,但它在预测我的机器何时从使用 RAM 切换到使用交换并且变得非常慢时并不是不准确的!例如,当我将第一个数组大小增加到 60 x 400k 时,我的内存不足,一切都停止了。
是我的数学有问题,还是我的计算机估计它存储的数据量的方式有问题?
编辑:或者是因为我存储基于指针的数据的方式使分配器混淆到大量过度补偿存储需求?
编辑 2:数据存储在 stl::vector< stl::vector<gsl::gsl_vector * > >
结构中。我读到 Eigen 不使用动态内存分配:这会导致内存管理的实质性改进吗?
【问题讨论】:
没有看到你的数据结构,很难说。我认为你的数学对原始双打或多或少是正确的。但是,根据您是针对 32 位还是 64 位进行编译,指针各有 4 个或 8 个字节。 好的,我会添加结构:) 【参考方案1】:您正在创建 600,000 个std::vectors
。这是很多开销。这些向量中的每一个都不仅仅是一个数组——还有指针、大小、容量、对齐等的开销。另外我怀疑你在堆上分配你的 GSL 向量?
Eigen 可以部分解决您的问题,因为它具有 Matrix 类的静态特化。但是,您应该真正考虑使用适当的 3d 连续存储数组/张量对象。
【讨论】:
哇,谢谢!我没有想到 stl::vectors。是的,gsl_vectors 被分配给堆...... 3D 矩阵一定是在某个地方实现的,但我在 Eigen 和 Blaze 文档中都找不到它。这两个库都以高性能和 C++ 风格着称。你知道这样的张量矩阵库吗? 有数:Blitz、Pooma、boost::multi_array,犰狳有Cube类。但是使用operator()(i,j,k)
重载很容易自己制作
很抱歉这么晚才回复您的答案。有没有办法构造立方体类,以便在内部数组中维护gsl_vector *
?我不想在一分钟内重写太多代码。以上是关于我有记忆不一致吗?苹果系统的主要内容,如果未能解决你的问题,请参考以下文章