Armadillo:堆上的高效矩阵分配
Posted
技术标签:
【中文标题】Armadillo:堆上的高效矩阵分配【英文标题】:Armadillo: efficient matrix allocation on the heap 【发布时间】:2011-11-29 17:51:30 【问题描述】:我正在使用 Armadillo 在 C++ 中处理从 CSV 文件读取的大型矩阵。
mat X;
X.load("myfile.csv",csv_ascii);
colvec x1 = X(span::all,0);
colvec x2 = X(span::all,1);
//etc.
所以 x1,...,xk(比如k=20
)是 X 的列。X 通常会有 2000 到 16000 的行。我的问题是:
如何将 X 分配(并随后解除分配)到堆(空闲存储)上?
Armadillo 文档的This section 解释了垫子的辅助内存分配。这和堆分配一样吗?它需要矩阵维度的先验知识,直到从 csv 读取 X 后我才知道:
mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true)
任何建议将不胜感激。 (我正在使用 g++-4.2.1;我当前的程序在我的 Macbook Pro 上本地运行良好,但是当我在我大学的计算集群(Linux g++-4.1.2)上运行它时,我遇到了分段错误。程序太大,无法发布)。
编辑:我最终这样做了:
arma::u32 Z_rows = 10000;
arma::u32 Z_cols = 20;
double* aux_mem = new double[Z_rows*Z_cols];
mat Z(aux_mem,Z_rows,Z_cols,false,true);
Z = randn(Z_rows, Z_cols);
它首先在堆上分配内存,然后告诉矩阵 Z 使用它。
【问题讨论】:
【参考方案1】:通过查看源代码,Armadillo 已经在堆上分配了大型矩阵。
要减少所需的内存量,您可能需要使用 fmat 而不是 mat。这会以降低精度为代价。
fmat 使用浮点数,而 mat 使用双精度:参见http://arma.sourceforge.net/docs.html#Mat。
Linux 计算集群的系统管理员也可能对其启用了限制(例如,每个用户最多只能分配一定数量的最大内存)。例如,请参阅http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm。
【讨论】:
犰狳是否也会释放内存,还是应该由用户来完成? @MikelUrkia - 任何正确编写的 C++ 库都会自动释放其对象使用的内存。是什么让您认为需要手动完成? C++ 不是 C。 我是 C 和 C++ 方面的新手,非常感谢您花时间回答我的问题。正如我在另一个问题中提到的,如果 Armadillo 负责内存管理,它将大大减轻我的工作量。以上是关于Armadillo:堆上的高效矩阵分配的主要内容,如果未能解决你的问题,请参考以下文章