Shimadaさんからの報告で、AutoCADのEntityがTransaction中に解放されず、メモリ馬鹿食いしてるとのこと。調査して見たことをまとめておきます。

なお、完全に調べたわけではなく動きから把握したものなので、要調査です。

  • AutoCADのEntityはGetObject()等で生成される。
  • 同一ObjectIdのEntityでも何度も生成される。
    (単なるラッパーらしい。)
  • TransactionをCommit/Abortすると解放される。
  • Disposeすることにより解放できる。
    (C++ではClose()があるが、C#側では非推奨メソッド)
  • DisposeしたEntityにアクセスすると落ちる。

大きいものになるとKb単位のものがあり、大きな図面に対して処理を行うと数百MB単位で無駄が発生します。とは言え、取得メソッドと利用メソッドが離れているケースも多く、安易にDisposeをするとキャッシュを破壊することもあります。共有Entityなのか一時Entityなのか上手く判断できればいいんですけどね。。。

カテゴリー: 技術情報