C# 联合Halcon编程,长时间调用执行halcon脚本引擎,提示内存不足

查看 91|回复 9
作者:Rison926   
有搞机器视觉的大佬吗?请教个问题。
我这边有个C# 联合Halcon编程的平台,平台应用是32位的应用程序,开启了大内存感知,所以最大调用内存能达4G,实测确实可以调用到4G内存。
在平台中调用了版本为17.12的x86版的halcon.dll ,调用方法:调用halcon脚本引擎,在脚本引擎中执行halcon方法脚本。
在halcon软件中循环长时间执行这个脚本没有任何问题,在平台中长时间循环调用脚本引擎,前面跑一切顺利,但是大概执行4到8小时会出现问题,脚本引擎返回报错信息:Not enough memory available。
平台已经用内存监控工具检测过,没有内存泄露,刚开始执行的内存大小,与执行4小时后占用的内存大小没什么变化,而且我可以肯定我平台只用了700M,还有3G多的空间可以给脚本引擎去执行,所以应该不存在脚本引擎不够内存去执行的,所以可以肯定是在halcon脚本引擎中导致的。
但是脚本中所有H开头的对象都在用完就释放了,而且在halcon软件中单独循环执行却没问题(这相当于排除了halcon脚本内存泄露的可能),这就让人十分费解了,到底是哪里出了问题。
平台太大无法迅速升级为64位,所以无法更换成64位的halcon.dll
有同行大佬也遇到过这样的问题吗?能把解决方案分享一下给小弟吗?
已经试过的方案:
1.设置halcon脚本引擎最大内存空间
2.设置halcon缓存模式为:idle
电脑配置:
系统:win10 64位
CPU: i7 7代
内存: 8g
GPU: 2G(任务管理器中看到没有用上)

脚本, 引擎

kiki1226   

从您提供的问题描述来看,出现“没有足够的可用内存”错误可能有以下几个原因:
内存泄漏:虽然您使用了内存监控工具检测过,但是仍然有可能存在内存泄漏。建议结合代码和日志分析内存使用情况,如果发现确实存在内存泄漏,可以通过释放占用内存的资源来解决。
内存碎片化:由于您的应用程序长时间运行,内存中可能会产生大量的碎片,导致无法申请到连续的内存空间。这种情况下可以尝试在适当的时候进行内存整理,或者重启应用程序来清除内存碎片。
Halcon DLL版本问题:由于您的平台是32位的应用程序,使用的是x86版的halcon.dll,因此也有可能是DLL版本的问题导致内存不足。建议尝试更新或更换不同版本的halcon.dll来解决该问题。
其他系统资源不足:除了内存不足之外,还有可能是其他系统资源不足导致的。例如,CPU或磁盘I/O等方面出现瓶颈。您可以使用性能监视器等工具来监控系统资源使用情况,以确定是否存在其他资源限制导致的问题。
ChatGPT回答
Rison926
OP
  


kiki1226 发表于 2023-4-7 15:30
从您提供的问题描述来看,出现“没有足够的可用内存”错误可能有以下几个原因:
内存泄漏:虽然您使用了 ...

ChatGPT我已经问到它答非所问了,那玩意halcon这块的训练料太少了,只能告诉你个方向,但是给的方向都排查过了,没找到问题
larryliao   

搜索到一篇文章,看看是不是你想要的
halcon12不会自动释放不再使用的内存,需要手动释放。
[C#] 纯文本查看 复制代码开发环境:windows7-64位,VisualStudio2013-C#,halcon12-64位
用C#调用同事用Halcon12写的图片处理程序时,内存一直增加,无法释放。halcon每次处理4张图片,每张图片10M,每次调用之后,内存就增加40M无法释放。在C#中将能释放的图像资源全部释放后,问题仍然得不到解决。
最终查出为halcon12不会自动释放不再使用的内存,需要手动释放。
gen_measure_rectangle2 (param[0]+Index*20, param[1], 0, 300, 20, Width, Height, 'nearest_neighbor', MeasureHandle)
gen_rectangle2 (Rectangle1, param[0]+Index*20, param[1], 0, 200, 20)
measure_pos (image, MeasureHandle, 1, param[2], param[3], param[4], RowEdge, ColumnEdge, Amplitude, Distance)
if(|RowEdge|>0)
    row:=[row,RowEdge]
    col:=[col,ColumnEdge] 
    gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 36, 0.785398)
    concat_obj (okregion, Cross, okregion)
endif
close_measure (MeasureHandle)
以上代码为halcon12中的代码,注意划横线的两行,及红色变量。最后调用close_measure方法释放内存。即算子调用结束,一定要配合close_measure方法释放内存,否则容易出现内存泄漏问题。
其他例如:read_ocr_class_mlp 一定要配合clear_ocr_class_mlp
read_ocr_class_mlp ('Document.omc', OCRHandle)
do_ocr_multi_class_mlp (Characters, ImageReduced, OCRHandle, X, Confidence)
clear_ocr_class_mlp(OCRHandle)
以上内存泄漏问题,在halcon16中没有发生,即没有手动释放,也没有发生内存泄漏
flyer_2001   

把windows虚拟内存调大试试看。
Rison926
OP
  


flyer_2001 发表于 2023-4-7 22:59
把windows虚拟内存调大试试看。

没用,试过了
Rison926
OP
  


larryliao 发表于 2023-4-7 21:25
搜索到一篇文章,看看是不是你想要的
halcon12不会自动释放不再使用的内存,需要手动释放。

我的是17.12,而且也手动释放了
AHDylan   

手动释放要在每一次使用完,之后不用的地方释放掉
Rison926
OP
  


AHDylan 发表于 2023-4-10 20:36
手动释放要在每一次使用完,之后不用的地方释放掉

释放了,用完都Dispose了
Rison926
OP
  

没人遇到这个问题吗
您需要登录后才可以回帖 登录 | 立即注册

返回顶部