情報詳細Q:Disposeを行いガベージコレクションを行っていても、ループごとに処理時間が悪化することがあります。create系のオペレータはすべてclearしています。A:C#の場合、HObjectやHTupleなどは基本的にはDisposeで解放されます。解放されないものとして、オペレータ内部で使用するメモリ(temporary_mem_cache)はHALCON側のライブラリ内で確保したメモリでして、HALCONライブラリの実装はC言語であるためtemporary_mem_cacheは明示的な解放が必要になります。以下参考情報になります。set_systemのパラメータ、global_mem_cache,temporary_mem_cacheをそれぞれ'idle'に設定し、image_cache_capacityを0に設定することでメモリの解放を明示的に行うことは可能です。ただし、これらのパラメータは基本的には再度使うときにHALCON側が再度メモリを確保しないように済むようにという高速化の枠組みに組み込まれたものでして、メモリの消費量は抑えられますが、処理時間は増加するものと思われます。もし、今回DisposeとGC.Collectを行ったことにより処理時間の増加が解消されたようでしたら、当初の問題である処理時間の増加という問題は解決されたと考えられるのでデフォルト設定にしたままお使いいただければと思いますが、もし、処理時間の増加という問題が解消されていないようでしたら上記もお試しいただければと思います。説明:1.global memoryHALCONオペレータコール「間」で持続する必要があるオブジェクトに割り当てられるメモリ。(すなわち、オペレータの戻り値として確保されるメモリ。)たとえば、tupleの要素として返される文字列は、グローバルメモリから割り当てられます。1024バイト未満のグローバルメモリオブジェクトは、グローバルメモリキャッシュに格納され、不要になったときには解放されません。このメモリは、システムのmalloc()関数を呼び出すこと無く、HALCONで再利用することができます。1024バイト以上のグローバルメモリオブジェクトは必要なくなった場合に解放されます。グローバルメモリキャッシュはOnまたはOffにすることはできますが、サイズを制限したり指定することはできません。割り当てるサイズは、そのシステムのアライメント係数の倍数に切り上げられる形で必要なサイズを割り当てます。parallel HALCONの場合、グローバルメモリキャッシュはsharedまたはthead localになります。(set_systemの'global_mem_cache'の設定に準じます。)2.Image memory画像に使用されるメモリです。このメモリは独自のイメージキャッシュがあります。最大サイズはset_systemのimage_cache_capacityにより制御できます。3.temporary memoryオペレーターの実行中にのみ使用するメモリ。このメモリはテンポラリメモリキャッシュにキャッシュされます。グローバルメモリとは異なり、テンポラリメモリは大きなスーパーブロック(SuperBlocks)に割り当てられ、必要に応じて細分されます。スーパーブロックはスタックのように管理されます。(つまり、新しいオブジェクトは常にスタックの最上部に配置され、オブジェクトは作成された逆の順序でのみ解放されます。 )常に1つの現在のスーパーブロックが割り当てられ、HALCONのメモリ要求を満たすために使用されます。現在のスーパーブロックに十分な空きメモリが残っていない場合、新しいスーパーブロックが割り当てられ、これが現在のものになります。前のスーパーブロックに残っている空きメモリは、新しい現在のスーパーブロックが解放されるまで未使用のままになります。スーパーブロックのサイズは、現在のイメージサイズに基づくヒューリスティックによって決定されます。このサイズは、set_systemのalloctmp_max_blocksizeパラメータによって制限されます。(HALCONが最大ブロックサイズより大きいメモリブロックを要求する場合、この設定に関係なくより大きいスーパーブロックが割り当てられます。)parallel HALCONの場合、テンポラリメモリキャッシュはthead localになります。すなわち、つまり、HALCONを使用するすべてのスレッドは独自のキャッシュを持ちます。解決事例)/HALCONのメモリ使用設定を一度最軽量にした後、元に戻す。これによりメモリを開放する { //軽量化 HTuple ht_bk_image_cache_capacity;HOperatorSet.GetSystem("image_cache_capacity", out ht_bk_image_cache_capacity); HOperatorSet.SetSystem("image_cache_capacity",0); HOperatorSet.SetSystem("temporary_mem_cache", "idle");HOperatorSet.SetSystem("global_mem_cache", "cleanup");HOperatorSet.SetSystem("temporary_mem_reservoir_size",0);HOperatorSet.SetSystem("temporary_mem_reservoir", "false"); //設定リストア HOperatorSet.SetSystem("image_cache_capacity",ht_bk_image_cache_capacity); HOperatorSet.SetSystem("temporary_mem_cache", "exclusive");HOperatorSet.SetSystem("temporary_mem_reservoir_size",-1); HOperatorSet.SetSystem("temporary_mem_reservoir", "true"); }添付ファイルタイトルC# Garbage Collectionを行っているにも関わらずメモリ使用量が増えていき処理時間が悪化するURL 名000004893公開状況公開済み検証状況公開済み