2015-12-22 7 views
0

Я хочу знать, нужно ли освобождать память, занимаемую 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 может быть большой, и я нахожусь на низкой ОЗУ. Я знаю, когда основные доходы, ОС освободит locations и values, а также X. Но реальный вопрос заключается в том, является ли память, занятая X, такой же, как и locations, и values OR X выделяется память отдельно, и мне нужно освободить locations и values в футляре.

+0

он должен быть записан в документах библиотеки. если нет, 1. поставьте точку останова перед load_data, проверьте размер памяти, используемый вашим исполняемым файлом. 2. Загрузите значительно большие данные и найдите изменение размера памяти. 3.запустите строку sp_mat и посмотрите, приближается ли скорость увеличения памяти к шагу secon. если это то же самое удалить, иначе нет. Но, я считаю, есть лучший способ проверить это :) – seleciii44

+1

Почему вы не смотрите на исходный код Armadillo для класса _SpMat_? 'include/armadillo_bits/SpMat_meat.hpp' – hbrerkere

ответ

1

Конструктор (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); 

заполняет разреженную матрицу с копий значений в values.

Я понимаю, что вы обеспокоены тем, что вы будете запускать из памяти, и если вы держите 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 
} 

других вариантов бы я) использовать перемещение семантику непосредственно хода значения в val в X или б) непосредственно использовать память, выделенную для 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, поскольку такая функциональность еще не предоставлена ​​для разреженных матриц (до сих пор существует только простой механизм перемещения). Было бы неплохо запросить эти функции у разработчиков!

+0

Спасибо за ваши ан. Я нашел ан. хоть. В соответствии с armadillo, он выделяет память в кучу и отдельно от 'location' и' values'. Я могу освободить память сразу после выделения X. Для вашего второго варианта очень дорого заполнить X один за другим. Как сообщает Armadillo, пакетная вставка довольно быстрая. Я нашел то же самое, когда я попробовал ваше второе решение. Это очень трудоемко. Причина в том, что X разрежен и каждый раз, когда вы его заполняете, он ищет места, которые распределены случайным образом в большом массиве. Для этого требуется несколько накладных расходов. – chandresh