我需要处理mpz_t
的大数组并释放后记忆。但是,在使用htop
命令在每个阶段分析RSS时,mpz_clear
似乎不会完全释放内存。
以下是示例C代码:
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
int main(void) {
mpz_t *A;
int size = 1<<20;
A = (mpz_t *) malloc(size*sizeof(mpz_t));
getchar(); // RSS=876KB
for (int i=0; i<size; i++) {
mpz_init_set_ui(A[i],0);
}
getchar(); // RSS=50MB
for (int i=0; i<size; i++) {
mpz_clear(A[i]);
}
free(A);
getchar(); // RSS=34MB!!
return 0;
}
查看答案here,上面的内存释放过程(即在mpz_clear
元素&amp; mpz_t
数组上调用free
)已正确完成。
我也尝试使用mpz_class
C ++包装器的向量,如下所示,导致相同的情况。
#include <gmpxx.h>
#include <iostream>
#include <vector>
int main(void) {
std::vector<mpz_class> A;
int size = 1 << 20;
A.reserve(size);
std::cin.ignore();
for (int i=0; i<(size); i++) {
A.emplace_back(0);
}
std::cin.ignore();
std::vector<mpz_class>().swap(A);
std::cin.ignore();
return 0;
}
有没有办法释放为mpz_t
数组分配的整个内存?
感谢评论部分,我了解到free
does not necessarily release the memory back to the OS。但在我的情况下,在Ubuntu 16.04上使用glibc,free()
确实释放malloc
保留的内存量(即16 * 2 ^ 20 = 16MB,假设{{} 1}}是16字节)因为它超过了默认的M_MMAP_THRESHOLD
值(= 128KB)。
所以我怀疑GMP隐式分配了一些孤立的内存(上例中≈32MB),需要单独调用sizeof(mpz_t)
。