我们正在运行一个大型的MATLAB程序。大约24小时的计算后,它会因“内存不足”错误而停止。
在此错误发生前不久,进程状态非常稳定,该进程在12 Gb RAM机器上使用大约3 Gb并具有32 Gb交换。我们没有理由相信这个过程应该有很大的不同,它是在类似过程的迭代3中,前三次迭代导致VmPeak为2.7 Gb。使用MATLAB r2013a,使用-nojvm选项在没有GUI的情况下运行该过程。错误发生在两台不同的计算机上。根据确切的参数化,错误发生在程序的不同位置。
我的问题是:在MATLAB / Linux / 64位中是否有另外的资源而不是普通的RAM可以链接到Out of Memory消息?是否与内存碎片有关,我们如何衡量当前的内存碎片级别?
Matlab错误:
CATCH in vsProcessVideosetByFrame.Error using cat
Out of memory. Type HELP MEMORY for your options.
Error in ttClassDetections/horzcat (line 170)
output.data.(fn{j}) = cat(2,temp{:});
在内存不足消息崩溃之前不久处理状态:
schuttek@pc-07843:~$ cat /proc/14123/status
Name: MATLAB
State: S (sleeping)
Tgid: 14123
Ngid: 0
Pid: 14123
PPid: 1
TracerPid: 0
Uid: 8793 8793 8793 8793
Gid: 100 100 100 100
FDSize: 256
Groups: 4 24 27 30 46 100 108 124 501
NStgid: 14123
NSpid: 14123
NSpgid: 14123
NSsid: 11423
VmPeak: 2744640 kB
VmSize: 2613568 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 1045376 kB
VmRSS: 1025692 kB
VmData: 2095720 kB
VmStk: 132 kB
VmExe: 12 kB
VmLib: 179980 kB
VmPTE: 2920 kB
VmPMD: 24 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
Threads: 18
SigQ: 1/64005
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000008080006
SigIgn: 0000000000000001
SigCgt: 00000001880804ee
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Seccomp: 0
Cpus_allowed: ffffffff
Cpus_allowed_list: 0-31
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 37
nonvoluntary_ctxt_switches: 5
答案 0 :(得分:0)
由于这可能不是OOM杀手(因为dmesg | grep kill
为空),所以错误应该是MATLAB内部的。
一个可能的原因确实是内存碎片化;至少有些MATLAB例程似乎要求显式连续的内存区域,你可能会用完。这可以通过pack
- 一个协调内存的MATLAB函数来缓解。
这是文档页面。请务必注意大于2GB的变量警告!
答案 1 :(得分:0)
到目前为止,在Windows 10 64位系统上运行似乎解决了我们的问题。