【发布时间】:2021-06-05 22:13:43
【问题描述】:
我目前正在编辑我继承的程序,以便能够处理 23 GB 的文件。因此,为了保持低内存,我使用mmap 来加载我在之前的程序中创建的数组。然而,我加载这些数组,然后进入一个函数,共享和保留的内存峰值,即使我不相信我曾经分配过任何东西。运行时,内存从 0 开始,然后迅速增加到 90%(~36GB,因为我有 40GB 的内存)并保持在那里。最终,我开始需要内存(小于 30GB),然后程序被杀死。
通常,我会怀疑这个问题是由于分配造成的,或者我以某种方式分配了内存。但是,我没有分配任何内存(尽管我正在阅读mmaped 文件)。
奇怪的是,保留的内存等于共享的内存量(见附件截图)。
我为访问映射数组而编写的函数:
double* loadArrayDouble(ssize_t size, char* backupFile, int *filedestination) {
*filedestination = open(backupFile, O_RDWR | O_CREAT, 0644);
if (*filedestination < 0) {
perror("open failed");
exit(1);
}
// make sure file is big enough
if (lseek(*filedestination,size*sizeof(double), SEEK_SET) == -1) {
perror("seek to len failed");
exit(1);
}
if (lseek(*filedestination, 0, SEEK_SET) == -1) {
perror("seek to 0 failed");
exit(1);
}
double *array1 = mmap(NULL, size*sizeof(double), PROT_READ | PROT_WRITE, MAP_SHARED, *filedestination, 0);
if (array1 == MAP_FAILED) {
perror("mmap failed");
exit(1);
}
return array1;
}
如果需要包含任何其他代码,请告诉我。即使double* file1 = loadArrayDouble(SeqSize, "/home/HonoredTarget/file1", &fileIT); 被多次调用(对于 6 个数组中的每一个),内存似乎也会显着增加
【问题讨论】:
-
有什么问题?什么是RSS? (也许您正在查看错误的指标)
-
感谢您的评论!立即检查
-
不确定我是否正确,但我跑了
cat /proc/8904/status,其中 8904 是 pid,它说RssFile: 36050208 kB所以看起来差不多.. RssAnon 是 104 kb 和 RssShmem是 0kb -
用较小的阵列测试(或检查系统日志)也许你遇到了OOM杀手。
-
抱歉,有点草率。我一直在想其他的事情要说。我现在完成了:-)
标签: c memory-management shared-memory mmap