2015年9月19日土曜日

Hash コンテナは、メモリ喰いなのね、、

最近作成したアプリで、過度にメモリを消費する状況があったんだ。
データをコンテナ管理するクラスを多数(100個位)生成していたのだけど、
レコード数は0件でも、クラスを生成するだけで、メモリが100MByte近く消費される状況だった。
最初はレコードを構成するのに、取り敢えずどのような型でも突っ込めるVariantクラスでレコード型定義しているのが、原因なのかな?と考えていたのだけど、小さなプログラムでVariantで表現したレコードクラスとStringで表現したレコードクラスを比較しても100MByteを消費する程、差は生じなかった。
そこで、自作のデータコンテナクラス内にて持っていた色々な従属情報を、使用されるタイミンで都度 Create するように順次修正しながら、メモリの使用状況を確認していったんだ。
そしたら、ある従属情報で急にメモリの使用量が減った。
その従属情報は、継承元に FPC ライブラリの contnrs.TFPObjectHashTable を使用していたのだけど、試しに TStringList で代用したクラスで再実装してみたところ、その従属情報を Create してもメモリ喰いは起きなくなった。
あれ? TFPHashXXXX 系って、データ突っ込まなくても、クラス生成だけでメモリ喰いするのかな?
と、思いながらも他にも使用していた TFPHashXXXX を取り敢えず、代替簡易クラスを作成して置換えていったら、使用メモリが激減するようになった。

作成したアプリで使用していた TFPHashXXXX 系は、以下だった。

contnrs
-----------------------------
TFPHashList
TFPStringHashTable
TFPObjectHashTable


結局今回は、文字列キーからの参照速度はさておき TStringList.Objects プロパティで、置換え可能な箇所は修正することにした。
TFPHashXXXX 系は、使用されるメモリ量が増える事を把握した上で、文字列キーで検索速度を優先したい場合に使用するようにする、と言うことなのかな。

0 件のコメント:

コメントを投稿