设置首页收藏本站
开启左侧

[C#] C#联合halcon多线程导致的虚拟内存持续增加

[复制链接]
汉堡 发表于 2025-2-4 16:26:13 | 显示全部楼层 |阅读模式
悬赏100视觉币
本帖最后由 汉堡 于 2025-2-4 16:27 编辑
  1. Parallel.For(0, 4, j =>{     //大量halcon检测程序      });
复制代码
软件运行后系统虚拟内存会随着检测次数的增加而增加直到最大导致电脑卡死,取消多线程后虚拟内存比较稳定,为满足CT需求必须使用多线程,求大佬答疑解惑!

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Criss 发表于 2025-2-4 17:01:26 | 显示全部楼层
子线程调用的函数内部处理的图像数据,一般都是局部的,申请后记得函数最后释放。如果是成员的,可以反复使用,重新赋值前也要释放。
除了Dispose方法还有ClearShapleModel类似的算子方式解决。
由于HalconDotNet实现了非托管到托管对象的转换使用,Halcon本身的对象还是需要手动释放的。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 汉堡 发表于 2025-2-4 17:19:44 | 显示全部楼层
Criss 发表于 2025-2-4 17:01
子线程调用的函数内部处理的图像数据,一般都是局部的,申请后记得函数最后释放。如果是成员的,可以反复使 ...

局部的图像数据在使用前后都进行了释放的,成员变量相关的代码也被屏蔽了,目前用的都是Dispose方法进行释放的,没有用到模板匹配,多线程还是存在问题
Halcon本身的对象指的是哪些呢?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

新凉无处暑 发表于 2025-2-6 09:25:02 | 显示全部楼层
本帖最后由 新凉无处暑 于 2025-2-6 11:38 编辑

1.Parallel类是对Task对象的封装,会使用委托消耗一部分系统资源
2.只有当所有任务都完成,调用线程才会回到线程池;否则调用线程会挂起
3.检查下你程序,当前的并发调用是否执行完成才执行下次并发;若当前并发调用未完成,下次并发嗲用时线程池会生成新的线程来执行,久而久之导致线程越来越多。而线程的执行在物理cpu上的,由于任务越来越多导致CPU频繁进行上下文切换,会导致系统的运行都受到影响
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 汉堡 发表于 2025-2-11 11:25:02 | 显示全部楼层
新凉无处暑 发表于 2025-2-6 09:25
1.Parallel类是对Task对象的封装,会使用委托消耗一部分系统资源
2.只有当所有任务都完成,调用线程才会回 ...

Parallel.For要等所有线程执行完之后才会执行后面的程序,不存在这种情况,而且程序最后面我加了等待所有线程结束的判断
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

新凉无处暑 发表于 2025-2-12 08:36:01 | 显示全部楼层
汉堡 发表于 2025-2-11 11:25
Parallel.For要等所有线程执行完之后才会执行后面的程序,不存在这种情况,而且程序最后面我加了等待所有 ...

处理的图像是放在队列逐个处理的吗?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 汉堡 发表于 2025-2-12 14:13:34 | 显示全部楼层
新凉无处暑 发表于 2025-2-12 08:36
处理的图像是放在队列逐个处理的吗?

不是逐个处理的,线程里并行处理的
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

返璞归真 发表于 2025-2-12 19:59:23 | 显示全部楼层
垃圾回收调整:研究并调整垃圾回收策略,以适应你的应用程序的内存使用模式。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

新凉无处暑 发表于 2025-2-13 08:39:56 | 显示全部楼层
汉堡 发表于 2025-2-12 14:13
不是逐个处理的,线程里并行处理的

我的建议是:若不改变硬件的话,可同时处理几张图像(自己测试);或把CPU和内存的性能提升;垃圾回收的话,halcon的有个建议是方法调用完进行释放GC.Collection;但是,以我对CLR的了解,GC会挂起全部线程去检查对象的根,这个非常影响性能。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表