关于armadillo稀疏矩阵中的内存分配
On memory allocation in armadillo sparse matrices
我想知道在创建稀疏矩阵后,是否需要释放locations
和values
对象占用的内存。这是代码:
void load_data(umat &locations, vec& values){
// fill up locations and values
}
int main(int argc, char**argv){
umat loc;
vec val;
load_data(loc,val);
sp_mat X(loc,val);
return 0;
}
在上面的代码中,load_data()
填充locations
和values
对象,然后在main()
中创建稀疏矩阵。我的问题:在构造X
之后,我需要释放位置和值使用的内存吗?原因是X
可能很大,而我的RAM很低。我知道当main返回时,操作系统将释放locations
和values
以及X
。但是,真正的问题是X
占用的内存是否与locations
和values
占用的内存相同,或者X
是单独分配的内存,在这种情况下我需要释放locations
和values
。
您正在使用的构造函数(SpMat_meat.hpp:231)
template<typename T1, typename T2>
inline SpMat(const Base<uword,T1>& locations, const Base<eT,T2>& values, const bool sort_locations = true);
用CCD_ 18中的值的副本填充稀疏矩阵。
我知道你担心内存会用完,如果你把loc
、val
和X
分开,你基本上有两个相同数据的副本,占用的内存是实际需要的两倍(这确实是你的代码片段中发生的事情),所以我会试着集中精力解决这个问题,并给你几个选项:
1) 如果您可以短时间保留两个数据副本,最简单的解决方案是动态分配loc
和val
,并在初始化X
后立即删除它们
int main(int argc, char**argv){
umat* ploc;
vec* pval;
load_data(*ploc,*pval);
// at this point we have one copy of the data
sp_mat X(*ploc,*pval);
// at this point we have two copies of the data
delete ploc;
delete pval;
// at this point we have one copy of the data
return 0;
}
当然,你可以使用安全指针而不是C风格的指针,但你已经明白了。
2) 如果您绝对不想在任何时候都有两个数据副本,我建议您修改load_data
例程,以逐个顺序加载值,并将它们直接插入X
void load_data(umat &locations, vec& values, sp_mat& X){
// fill up locations and values one by one into X
}
其他选项是i)使用移动语义将val
中的值直接移动到X
中,或者ii)直接使用为val
分配的内存作为X
的内存,类似于矩阵的高级构造函数
Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem = true, const bool strict = false)
然而,这两个选项都需要在armadillo库的级别上进行修改,因为还没有为稀疏矩阵提供这样的功能(到目前为止,只有一个简单的移动构造函数)。不过,向开发人员请求这些功能是个好主意!
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配