C++ 内存占用增加
我被困在一个有线的情况;我的C++ 内存占用增加,c++,memory-management,out-of-memory,C++,Memory Management,Out Of Memory,我被困在一个有线的情况;我的c++代码一直在消耗更多内存(大约达到70G),直到整个进程被终止 我正在调用Python中的C++代码,它实现了最长公共子序列长度算法 C++代码如下所示: #define MAX(a,b) (((a)>(b))?(a):(b)) #include <stdio.h> int LCSLength(long unsigned X[], long unsigned Y[], int m, int n) { int** L = new int*
c++
代码一直在消耗更多内存(大约达到70G
),直到整个进程被终止
我正在调用Python
中的C++
代码,它实现了最长公共子序列长度算法
C++
代码如下所示:
#define MAX(a,b) (((a)>(b))?(a):(b))
#include <stdio.h>
int LCSLength(long unsigned X[], long unsigned Y[], int m, int n)
{
int** L = new int*[m+1];
for(int i = 0; i < m+1; ++i)
L[i] = new int[n+1];
printf("i am hre\n");
int i, j;
for(i=0; i<=m; i++)
{
printf("i am hre1\n");
for(j=0; j<=n; j++)
{
if(i==0 || j==0)
L[i][j] = 0;
else if(X[i-1]==Y[j-1])
L[i][j] = L[i-1][j-1]+1;
else
L[i][j] = MAX(L[i-1][j],L[i][j-1]);
}
}
int tt = L[m][n];
printf("i am hre2\n");
for (i = 0; i < m+1; i++)
delete [] L[i];
delete [] L;
return tt;
}
因此,在C++
代码中,在new
操作(该操作可以在堆上分配大量内存)之后,在循环中不会有更多的额外内存消耗
然而,令我惊讶的是,我发现在循环期间使用的内存不断增加。(我正在Linux
上使用top
,在进程终止之前,它会一直打印I am her1
)
在这一点上我真的很困惑,因为我猜在内存分配之后,循环中只有一些算术运算,为什么代码占用更多内存
我够清楚了吗?谁能在这个问题上给我一些帮助?谢谢大家! 看看你在做什么:
#include <iostream>
int main(){
int m = 36840;
int n = 833841;
unsigned long total = 0;
total += (sizeof(int) * (m+1));
for(int i = 0; i < m+1; ++i){
total += (sizeof(int) * (n+1));
}
std::cout << total << '\n';
}
#包括
int main(){
int m=36840;
int n=833841;
无符号长总计=0;
总数+=(国际规模)*(m+1);
对于(int i=0;i std::cout您消耗了太多内存。系统不会在分配时死掉的原因是Linux允许您分配的内存超过了您可以使用的内存
http://serverfault.com/questions/141988/avoid-linux-out-of-memory-application-teardown
我只是在一台测试机上做了同样的事情。我能够通过使用new并启动循环,只有当系统认为我消耗了太多的可用RAM时,它才会杀死我
这就是我得到的。dmesg中一条可爱的OOM消息
[287602.898843] Out of memory: Kill process 7476 (a.out) score 792 or sacrifice child
[287602.899900] Killed process 7476 (a.out) total-vm:2885212kB, anon-rss:907032kB, file-rss:0kB, shmem-rss:0kB
在Linux上,您会在内核日志或dmesg的输出中看到类似的内容
[287585.306678] Out of memory: Kill process 7469 (a.out) score 787 or sacrifice child
[287585.307759] Killed process 7469 (a.out) total-vm:2885208kB, anon-rss:906912kB, file-rss:4kB, shmem-rss:0kB
[287602.754624] a.out invoked oom-killer: gfp_mask=0x24201ca, order=0, oom_score_adj=0
[287602.755843] a.out cpuset=/ mems_allowed=0
[287602.756482] CPU: 0 PID: 7476 Comm: a.out Not tainted 4.5.0-x86_64-linode65 #2
[287602.757592] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014
[287602.759461] 0000000000000000 ffff88003d845780 ffffffff815abd27 0000000000000000
[287602.760689] 0000000000000282 ffff88003a377c58 ffffffff811d0e82 ffff8800397f8270
[287602.761915] 0000000000f7d192 000105902804d798 ffffffff81046a71 ffff88003d845780
[287602.763192] Call Trace:
[287602.763532] [<ffffffff815abd27>] ? dump_stack+0x63/0x84
[287602.774614] [<ffffffff811d0e82>] ? dump_header+0x59/0x1ed
[287602.775454] [<ffffffff81046a71>] ? kvm_clock_read+0x1b/0x1d
[287602.776322] [<ffffffff8112b046>] ? ktime_get+0x49/0x91
[287602.777127] [<ffffffff81156c83>] ? delayacct_end+0x3b/0x60
[287602.777970] [<ffffffff81187c11>] ? oom_kill_process+0xc0/0x367
[287602.778866] [<ffffffff811882c5>] ? out_of_memory+0x3bf/0x406
[287602.779755] [<ffffffff8118c646>] ? __alloc_pages_nodemask+0x8fc/0xa6b
[287602.780756] [<ffffffff811c095d>] ? alloc_pages_current+0xbc/0xe0
[287602.781686] [<ffffffff81186c1d>] ? filemap_fault+0x2d3/0x48b
[287602.782561] [<ffffffff8128adea>] ? ext4_filemap_fault+0x37/0x51
[287602.783511] [<ffffffff811a9d56>] ? __do_fault+0x68/0xb1
[287602.784310] [<ffffffff811adcaa>] ? handle_mm_fault+0x6a4/0xd1b
[287602.785216] [<ffffffff810496cd>] ? __do_page_fault+0x33d/0x398
[287602.786124] [<ffffffff819c6ab8>] ? async_page_fault+0x28/0x30
[287585.306678]内存不足:杀死进程7469(a.Out)得分787或牺牲子进程
[287585.307759]已终止进程7469(a.out)总vm:2885208kB,anon rss:906912kB,文件rss:4kB,shmem rss:0kB
[287602.754624]a.out.oom killer:gfp\u mask=0x24201ca,order=0,oom\u score\u adj=0
[287602.755843]a.out cpuset=/mems_allowed=0
[287602.756482]CPU:0 PID:7476通信:a.out未受污染4.5.0-x86_64-linode65#2
[287602.757592]硬件名称:QEMU标准PC(i440FX+PIIX,1996),BIOS rel-1.8.2-0-g33fbe13由QEMU-project.org于2014年1月4日发布
[287602.759461]0000000000000000 ffff88003d845780 ffffffff815abd27 0000000000000000
[287602.760689]0000000000000 282 ffff88003a377c58 ffffffff811d0e82 ffff8800397f8270
[287602.761915]0000000000 F7D192 000105902804d798 ffffffff81046a71 ffff88003d845780
[287602.763192]呼叫跟踪:
[287602.763532][]?转储堆栈+0x63/0x84
[287602.774614][]?转储头+0x59/0x1ed
[287602.775454][]?kvm时钟读取+0x1b/0x1d
[287602.776322][]?ktime_get+0x49/0x91
[287602.777127][]?延迟帐户结束+0x3b/0x60
[287602.777970][]?oom_压井工艺+0xc0/0x367
[287602.778866][]?内存不足+0x3bf/0x406
[287602.779755][]?\u所有页面\u节点掩码+0x8fc/0xa6b
[287602.780756][]?所有页面当前+0xbc/0xe0
[287602.781686][]?文件映射_故障+0x2d3/0x48b
[287602.782561][]?ext4文件映射错误+0x37/0x51
[287602.783511][]?\u do\u故障+0x68/0xb1
[287602.784310][]?处理mm故障+0x6a4/0xd1b
[287602.785216][]?\u do\u page\u故障+0x33d/0x398
[287602.786124][]?异步页面错误+0x28/0x30
C和C++是不同的语言!<代码> 4 *(36840 + 1)*(833841 +1)*4=122878292488 < /COD> >如果代码> INT/COM> 4字节,消耗70G以上的内存是很自然的。它将消耗114Gib。
只保留内存,使用缓冲区实际上会消耗内存。同样的事情也可能发生在新建
上。离题:通过创建数组int*L=new int[(m+1)*(n+1)];
并手动进行二维映射(L[i*nPlusOne+j]),您可以节省大量内存管理和缓存未命中的数据StimoTo:在C和C++中,数组索引从<代码> 0代码>开始,循环通常使用<代码> i <长度>代码>,而不是<代码> >
[287585.306678] Out of memory: Kill process 7469 (a.out) score 787 or sacrifice child
[287585.307759] Killed process 7469 (a.out) total-vm:2885208kB, anon-rss:906912kB, file-rss:4kB, shmem-rss:0kB
[287602.754624] a.out invoked oom-killer: gfp_mask=0x24201ca, order=0, oom_score_adj=0
[287602.755843] a.out cpuset=/ mems_allowed=0
[287602.756482] CPU: 0 PID: 7476 Comm: a.out Not tainted 4.5.0-x86_64-linode65 #2
[287602.757592] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014
[287602.759461] 0000000000000000 ffff88003d845780 ffffffff815abd27 0000000000000000
[287602.760689] 0000000000000282 ffff88003a377c58 ffffffff811d0e82 ffff8800397f8270
[287602.761915] 0000000000f7d192 000105902804d798 ffffffff81046a71 ffff88003d845780
[287602.763192] Call Trace:
[287602.763532] [<ffffffff815abd27>] ? dump_stack+0x63/0x84
[287602.774614] [<ffffffff811d0e82>] ? dump_header+0x59/0x1ed
[287602.775454] [<ffffffff81046a71>] ? kvm_clock_read+0x1b/0x1d
[287602.776322] [<ffffffff8112b046>] ? ktime_get+0x49/0x91
[287602.777127] [<ffffffff81156c83>] ? delayacct_end+0x3b/0x60
[287602.777970] [<ffffffff81187c11>] ? oom_kill_process+0xc0/0x367
[287602.778866] [<ffffffff811882c5>] ? out_of_memory+0x3bf/0x406
[287602.779755] [<ffffffff8118c646>] ? __alloc_pages_nodemask+0x8fc/0xa6b
[287602.780756] [<ffffffff811c095d>] ? alloc_pages_current+0xbc/0xe0
[287602.781686] [<ffffffff81186c1d>] ? filemap_fault+0x2d3/0x48b
[287602.782561] [<ffffffff8128adea>] ? ext4_filemap_fault+0x37/0x51
[287602.783511] [<ffffffff811a9d56>] ? __do_fault+0x68/0xb1
[287602.784310] [<ffffffff811adcaa>] ? handle_mm_fault+0x6a4/0xd1b
[287602.785216] [<ffffffff810496cd>] ? __do_page_fault+0x33d/0x398
[287602.786124] [<ffffffff819c6ab8>] ? async_page_fault+0x28/0x30