试一试……抓for memory full error in imaq toolbox ?

4视图(30天)
威廉Thielicke
威廉Thielicke 2023年4月3日
编辑: dpb 2023年4月5日
你好,
我记录的数据与一个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年

答案(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循环。
结束
结束
9日评论
威廉Thielicke
威廉Thielicke 2023年4月4日
谢谢,我将查看原始误差函数并适应它。我还将设置一个全局标志打破while循环,这应该工作。

登录置评。


布鲁诺陈德良
布鲁诺陈德良 2023年4月3日
据我所知,没有简单的方法来检测内存问题。
你问MATLAB,例如,使用命令等
[~,sys] =记忆;
membytes = sys.PhysicalMemory.Available;%字节
我总是会报告一个正数,即使有内存耗尽,因为它将交换高清如果你需要MATLAB分配数组。当没有可用的物理RAM instanant收购SW正确运行有缓冲区溢出可能会导致崩溃。最棒的是监控membytes之前和检测时不再减少,低。这是一个迹象表明,RAM开始跳动,你必须预见并阻止收购之前崩溃。

威廉Thielicke
威廉Thielicke 2023年4月3日
我变得有点近,我能够显示一个对话框与一个合适的提示:
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。错误Fcn = @CustomIMAQErrorFcn;
开始(industrial_camera_vid);
industrial_camera_vid。帧Acquired < industrial_camera_vid.FramesPerTrigger
暂停(0.1)
[~,sys] =记忆;
membytes = sys.PhysicalMemory.Available;
disp ([的帧捕获:“num2str (industrial_camera_vid.FramesAcquired),内存:num2str (membytes)))
结束
函数error_cause CustomIMAQErrorFcn (~)
% imaqreset %执行,Matlab立即崩溃……
disp (“在捕获错误。”)
如果strcmpi (error_cause.Data.MessageID“imaq: imaqmex: outofmemory”)
对话框(的错误,内存已满,减少nr.帧捕获。,“模态”)
其他的
对话框([的错误,其他一些错误发生:error_cause.Data.MessageID),“模态”)
结束
结束
但是我想知道如果有一种方法可以阻止while循环我的自定义“CustomIMAQErrorFcn”?
这是输出:
捕获: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
错误在捕获。
不能分配内存传入的图像帧由于自由物理内存不足。
错误在memory_full(22)行
暂停(0.1)
捕获:4002,内存:1694830592
捕获:4002,内存:1694830592
捕获:4002,内存:1689645056
捕获:4002,内存:1689632768
捕获:4002,内存:1689620480
似乎仍然没有有一种方法来预测剩余内存的崩溃……
2的评论

登录置评。


dpb
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
tCapture =14×5表
框架 FreeMemory NFrames MemUsed MemPerFrame _____ __________ _________ __________ ___________3437 3.0994 e + 09年南南南3482 2.9969 e + 09年45 1.0243 e + 08年2.1707 3526 2.8912 e + 09年44 1.0576 e + 08年2.2923 3570 2.7866 e + 09年44 1.0459 e + 08年2.2669 3615 2.6783 e + 45 09年1.0825 e + 08年2.2942 3660 2.5723 e + 09年45 1.0603 e + 08年2.2471 3706 2.4641 e + 09年46 1.082 e + 08年2.2433 3752 2.3572 e + 09年46 1.0686 e + 08年2.2155 3799 2.2484 e + 09年47 1.0886 e + 08年2.2089 3845 2.137 e + 09年46 1.1141 e + 08年2.3098 3892 2.0276 e + 09年47 1.0939 e + 08年2.2197 3938 1.9155 e + 09年46 1.1208 e + 08年2.3237 3985 1.8089 e + 09年47 1.066 e + 08年2.163 4002 1.7084 e + 09年17 1.0051 e + 08年5.6383
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
dpb 2023年4月5日
编辑:dpb 2023年4月5日
不,我没有访问IMAQ结核病除了通过下载试用,然后没有任何硬件使用它,无论如何,如果做的。
但是,我认为这是结论性的,布鲁诺击中要害;结核病收购逻辑是愚蠢的;它分配整个缓冲区包括空间新形象每一帧和复制旧的缓冲区,最后添加一个新的框架。
2.2米/帧* 4 k帧是8.8克;当试图通过分配一个新的缓冲两倍+新的帧复制旧的过去,它超过了16 g可用和死亡。非常确凿的证据表明,它发生在几乎完全4 k的数字。
这是一个严重的错误在结核病设计/实现;它应该有一个清单结构或一些类似的方法来实现增长的额外的内存缓冲区,只添加下一帧。会有一些其他的开销保持数据结构,所以不能将所有内存分配给一个图像缓冲区,但肯定可以使用一个非常重要的部分总内存。当然,那么会遇到一个问题想处理这些以后如果做完全填满记忆,但是……
除非有一种预设的图片想要收集和数量将开始分配的总内存而不是自由运转的? ? ?
如果没有,我想说这是一种高质量的实现问题值得一个bug /问题报告TMW,似乎只选择一个必须收集更多的帧系统内存会增加内存。
或者,你能流到磁盘而不是吗?如果你的磁盘是一个SSD,性能比记忆不应该太糟糕了。

登录置评。

类别

找到更多的在启动和关闭帮助中心文件交换

s manbetx 845


释放

R2023a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!