在C#中使用Halcon 13函数FindNccModel会导致以下错误: HALCON错误#6001:运算符find_ncc_model中没有足够的可用内存
select 0, group_concat(DEVICE_ID SEPARATOR ',') from SMARTPHONE
函数本身可以在while循环中无限运行,但是如果将其与我们的程序结合使用,则会导致内存异常。另一方面,没有此功能,程序本身可以无限运行。有趣的是,该错误发生在程序到达典型的1,1 Gb内存之前,这意味着存在内存泄漏。
我在Halcon文档中没有找到关于此问题的任何参考,升级到最新的Halcon 13版本或使用Halcon XL都无济于事。有人知道什么可能导致此问题吗?
答案 0 :(得分:0)
在您的代码中,您已经按照建议的方式手动处置了大多数HALCON对象。您可能知道这是必要的,因为.NET垃圾收集器不知道托管对象可能使用的HALCON库处理的非托管内存量。
但是,您错过了处理包含FindNccModel htRow
,htColumn
,Angle
和Score
的结果的HTuples。
您可能还希望将HNCCModel的创建移出while循环。
答案 1 :(得分:0)
Halcon具有两个内存管理优化系统设置:global_mem_cache和temporary_mem_cache。 global_mem_cache没有影响,但是将临时_mem_cache参数设置为“ idle”或“ shared”可以解决该问题。
默认设置为“独占”,其中每个线程在本地缓存临时内存。这是Halcon文档的摘录:
'temporary_mem_cache'*),'tsp_temporary_mem_cache' 此参数控制临时内存高速缓存的操作模式。临时内存缓存用于通过缓存操作员执行期间临时使用的内存来加速应用程序。对于大多数应用程序,默认设置(“独占”)将产生最佳效果。支持以下模式:
'idle'临时内存缓存已关闭。与其他模式相比,此模式将占用最少的内存,但也会降低性能。
“共享”的所有临时存储器都全局缓存在临时存储器库中。此模式将比“独占”模式使用更少的内存,但通常也将提供更少的性能。
'exclusive'每个线程的所有临时内存都在本地缓存。此模式将使用最多的内存,但通常也会提供最佳性能。
'aggregate'大于通过'alloctmp_max_blocksize'参数设置的阈值设置的临时内存块将被缓存在全局内存库中,而所有较小的块将被汇总为一个块,每个线程在本地缓存。如果禁用了全局内存库,则释放大块。将根据线程到目前为止所看到的临时内存使用量来调整聚合块的大小,但不会大于“ alloctmp_max_blocksize”(如果设置)或小于“ alloctmp_min_blocksize”(如果设置)。此模式平衡了内存使用和速度,但是需要正确设置应用程序的内存使用模式的“ alloctmp_min_blocksize”和“ alloctmp_max_blocksize”,以提高有效性。
请注意,缓存模式'idle'设置为独占运行模式,而其他模式设置为可重入模式。
为了向后兼容,还接受值'false'和'true';它们分别对应于“ idle”和“ exclusive”。