我有一个来自特征库的稀疏矩阵,定义为:
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) 固定开销
正如评论中所讨论的,这里我解释稀疏矩阵格式
你调用
reserve()
,所以具体的子格式是uncompressed。这意味着我们有
2**25 * 26 * 4 byte
)2**25 * 4 byte
)这给了我们
(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 分配比现有内存更多的内存