关于armadillo稀疏矩阵中的内存分配

On memory allocation in armadillo sparse matrices

本文关键字:内存 分配 armadillo 关于      更新时间:2023-10-16

我想知道在创建稀疏矩阵后,是否需要释放locationsvalues对象占用的内存。这是代码:

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()填充locationsvalues对象,然后在main()中创建稀疏矩阵。我的问题:在构造X之后,我需要释放位置和值使用的内存吗?原因是X可能很大,而我的RAM很低。我知道当main返回时,操作系统将释放locationsvalues以及X。但是,真正的问题是X占用的内存是否与locationsvalues占用的内存相同,或者X是单独分配的内存,在这种情况下我需要释放locationsvalues

您正在使用的构造函数(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中的值的副本填充稀疏矩阵。

我知道你担心内存会用完,如果你把locvalX分开,你基本上有两个相同数据的副本,占用的内存是实际需要的两倍(这确实是你的代码片段中发生的事情),所以我会试着集中精力解决这个问题,并给你几个选项:

1) 如果您可以短时间保留两个数据副本,最简单的解决方案是动态分配locval,并在初始化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库的级别上进行修改,因为还没有为稀疏矩阵提供这样的功能(到目前为止,只有一个简单的移动构造函数)。不过,向开发人员请求这些功能是个好主意!