试一试……抓for memory full error in imaq toolbox ?
4视图(30天)
显示旧的评论
你好,
我记录的数据与一个usb3vision相机。我直接捕获内存。一段时间后,计算机的内存满和捕获停止。我想赶上这个错误,并显示一个消息框。这是我测试的代码:
clc
imaqreset
删除(imaqfind);前videoinputs %清除所有
hwinf = imaqhwinfo;
信息= imaqhwinfo (hwinf.InstalledAdaptors {1});
industrial_camera_name = info.DeviceInfo.DeviceName;
industrial_camera_万博1manbetxsupported_formats = info.DeviceInfo.SupportedFormats;
industrial_camera_vid = videoinput (info.AdaptorName info.DeviceInfo.DeviceID,“Mono8”);
industrial_camera_settings = (industrial_camera_vid);
industrial_camera_settings.Source。ExposureTime = 20;
industrial_camera_vid。帧PerTrigger = 10000;
flushdata (industrial_camera_vid);
试一试
开始(industrial_camera_vid);
%等(industrial_camera_vid);
而industrial_camera_vid。帧Acquired < industrial_camera_vid.FramesPerTrigger
暂停(1)
disp (num2str (industrial_camera_vid.FramesAcquired))
结束
抓我
imaqreset
如果strcmpi (ME.identifier“imaq: imaqmex: outofmemory”)
对话框(内存不足。内存已满,最有可能的是,你需要减少帧捕获修复这个错误。,“模态”);
结束
如果strcmpi (ME.identifier“imaq:等待超时”)
对话框(的图像捕获超时。最有可能的是,记忆是完整的,你需要更低的帧捕获修复这个错误。也有可能同步电缆是不正确地插入。,“模态”);
结束
结束
问题是while循环永远不会停止,即使图像捕获崩溃由于RAM。我怎样才能停止while循环,显示适当的错误消息?
这就是我的输出,while循环继续运行:
3870年
4031年
4192年
4353年
4514年
4675年
错误事件发生在16:38:40视频输入对象:Mono8-gentl-1。
不能分配内存传入的图像帧由于自由物理内存不足。
不能分配内存传入的图像帧由于自由物理内存不足。
错误在memory_full(第18行)
暂停(1)
4754年
4754年
4754年
4754年
4754年
0评论
答案(4)
图像分析
2023年4月3日
也许将尝试赶上在while循环。然后抓住,把休息把它踹循环如果是抛出一个错误。
开始(industrial_camera_vid);
而industrial_camera_vid。帧Acquired < industrial_camera_vid.FramesPerTrigger
试一试
%等(industrial_camera_vid);
暂停(1)
disp (num2str (industrial_camera_vid.FramesAcquired))
抓我
%一些错误发生如果你到达这里。
imaqreset
如果strcmpi (ME.identifier“imaq: imaqmex: outofmemory”)
uiwait(对话框(内存不足。内存已满,最有可能的是,你需要减少帧捕获修复这个错误。,“模态”));
结束
如果strcmpi (ME.identifier“imaq:等待超时”)
uiwait(对话框(的图像捕获超时。最有可能的是,记忆是完整的,你需要更低的帧捕获修复这个错误。也有可能同步电缆是不正确地插入。,“模态”)));
结束
打破;%的while循环。
结束
结束
dpb
2023年4月4日
编辑:dpb
2023年4月4日
好吧,你
可能
可以从上面的,但它是独特的布鲁诺指出…观察如果我们把监控数据和情节看它是什么样子(“一张图片胜过…”即使收集图片。< vbg >)
s = (“帧捕获:3437,内存:3099373568”
“帧捕获:3482,内存:2996944896”
“帧捕获:3526,内存:2891186176”
“帧捕获:3570,内存:2786598912”
“帧捕获:3615,内存:2678345728”
“帧捕获:3660,内存:2572312576”
“帧捕获:3706,内存:2464108544”
“帧捕获:3752,内存:2357243904”
“帧捕获:3799,内存:2248380416”
“帧捕获:3845,内存:2136969216”
“帧捕获:3892,内存:2027577344”
“帧捕获:3938,内存:1915494400”
“帧捕获:3985,内存:1808896000”
“帧捕获:4002,内存:1708388352”];
f = str2double (extractBetween(年代,“艾德:”,”、“));
m = str2double (extractAfter (s,的办法:));
tCapture =表(f, m,“VariableNames”,{“帧”,“FreeMemory”});
tCapture = addvars (tCapture[南;diff (tCapture.Frame)],[南;选项(tCapture.FreeMemory)],“NewVariableNames”,{“NFrames”,“MemUsed”});
tCapture.MemPerFrame = tCapture.MemUsed. tCapture.NFrames / 1024/1024
yyaxis左
情节(tCapture.Frame tCapture.FreeMemory / 1024 ^ 3,“X”)
ylabel (“自由内存(GB)”)
yyaxis正确的
情节(tCapture.Frame tCapture.MemPerFrame,“X”)
甘氨胆酸hAx =;
集(hAx.YAxis, {“TickLabelFormat”},{' % 0.1 f '})
标题(产品使用的图像捕获内存和帧数的)
ylabel (“记忆每帧(MB) ')
包含(的帧数)
我们可以观察到的内存使用几乎完全是线性的帧数,直到最后(*)时显示内存使用平均几乎翻了一番。我们没有每一个图像的数据观察,但一个假定可能呆在2 mb值直到最后获得帧,然后跑进了分配问题。
布鲁诺,似乎奇怪的系统仍有近2 gb的空闲内存,但似乎无法找到2 mb免费;这可能表明每个进程的内存使用量是如何被限制或其他问题处理。
(*)看更多的细节,NB的记忆每帧很平,直到3800年框架之后,然后似乎更变量由于某种原因。也是诱人的第一点显示之前建立了高原之后还低3500;这将是有趣的观察启动瞬态可能是什么样子的,如果出于某种原因,应用程序需要更多的内存,因为它是在每个图像的基础上。
我们不知道框架的大小/深度所以不知道这个比较预期的内存占用。
4评论
dpb
2023年4月5日
编辑:dpb
2023年4月5日
不,我没有访问IMAQ结核病除了通过下载试用,然后没有任何硬件使用它,无论如何,如果做的。
但是,我认为这是结论性的,布鲁诺击中要害;结核病收购逻辑是愚蠢的;它分配整个缓冲区包括空间新形象每一帧和复制旧的缓冲区,最后添加一个新的框架。
2.2米/帧* 4 k帧是8.8克;当试图通过分配一个新的缓冲两倍+新的帧复制旧的过去,它超过了16 g可用和死亡。非常确凿的证据表明,它发生在几乎完全4 k的数字。
这是一个严重的错误在结核病设计/实现;它应该有一个清单结构或一些类似的方法来实现增长的额外的内存缓冲区,只添加下一帧。会有一些其他的开销保持数据结构,所以不能将所有内存分配给一个图像缓冲区,但肯定可以使用一个非常重要的部分总内存。当然,那么会遇到一个问题想处理这些以后如果做完全填满记忆,但是……
除非有一种预设的图片想要收集和数量将开始分配的总内存而不是自由运转的? ? ?
如果没有,我想说这是一种高质量的实现问题值得一个bug /问题报告TMW,似乎只选择一个必须收集更多的帧系统内存会增加内存。
或者,你能流到磁盘而不是吗?如果你的磁盘是一个SSD,性能比记忆不应该太糟糕了。