评估 C++ 中某个内容的大小(以字节为单位)

问题描述 投票:0回答:1

我有一个来自特征库的稀疏矩阵,定义为:

Eigen::SparseMatrix<float> MyMatrix(2**n, 2**n). 

另外我使用了函数reserve:

MyMatrix.reserve(Eigen::VectorXi::Constant(2**n, n+1)); 

该矩阵每列有 n+1 个非零数字,并且有 2^n 列

我想要这个对象占用的实际大小(以字节为单位)。

如果我使用:

MyMatrix.size()

它给出了 n_rows*n_columns。

我确定这不是实际存储的大小,因为我检查了计算机的内存。

例如,我可以在计算机上创建一个 2^25 * 2^25 稀疏大小的浮点数矩阵,它应该占用〜10^15字节,这是根本不可能的。

如果我写

sizeof(MyMatrix) 

它给出 72,无论我使用哪个。这可能与类本身有关,而不是实际保存在其中的对象

更新2:

这是计算其大小的正确方法:

每个保留(或使用)元素有一个浮点数和一个整数,加上每列两个整数加上 sizeof(Matrix) 固定开销

c++ sparse-matrix eigen sizeof eigenclass
1个回答
0
投票

正如评论中所讨论的,这里我解释稀疏矩阵格式

你调用

reserve()
,所以具体的子格式是uncompressed。这意味着我们有

  • 每个非零或保留条目 1 个浮点数 (
    2**25 * 26 * 4 byte
    )
  • 每个非零或保留条目 1 个 int(与上面相同)
  • 每列 1 个 int 表示上面两个向量中该列的第一个非零条目的起始偏移量 (
    2**25 * 4 byte
    )
  • 每列 1 个 int 作为结尾(与上面相同)

这给了我们

(2 * 2**25 * 26 * 4 + 2 * 2**25 * 4) / 1024**3
= 6.75 GiB

让我们来测试一下:

#include <Eigen/Dense>
#include <Eigen/Sparse>

#include <malloc.h>


int main()
{
  int size = 1<<25;
  int nonzero_per_row = 26;
  Eigen::SparseMatrix<float> mat(size, size);
  mat.reserve(Eigen::VectorXi::Constant(size, nonzero_per_row));
  malloc_stats();
}

打印:

Arena 0:
system bytes     =     135168
in use bytes     =      74400
Total (incl. mmap):
system bytes     = 2952941568
in use bytes     = 2952880800
max mmap regions =          4
max mmap bytes   = 7247773696

如您所见,四个映射分配,总大小为 7,247,773,696 字节;即 6.75 GiB。

此功能适用于内存较少的笔记本电脑的原因是您尚未使用该内存。内存已映射,但未初始化,因此操作系统将其全部映射到它为此目的而具有的单个零页。例如,请参阅 使用 malloc 分配比现有内存更多的内存

© www.soinside.com 2019 - 2024. All rights reserved.