ページ 11

INIファイルアクセスの高速化

Posted: 2010年11月20日(土) 09:27
by にゃこ
こんにちは。INIファイル等を使った外部ファイルアクセスについて教えてください。

現在とあるシステムの外部ファイルによる設定の入出力等をメンテナンスしています。
色情報を取得するという処理がボトルネックとなっていて
COLO001~COL512までのキーをINIファイルから取得するという処理があります。
以前は32程度だったらしく問題ではなかったようです。

この解決策としてセクション単位で取得した後、バッファからパラメータを読むようにしました。

1.セクションで取得する際のバッファについて
同様のボトルネック解決のために、処理をクラス化して共通化したのですが
セクション単位で読む時のバッファ確保サイズをどう決めるのかに困りました。
現在はINIファイルのファイルサイズ分バッファを確保しています。

固定バッファで持って戻り値をチェックして失敗したら再試行という手もあるのですが、
何かしら必要サイズがスマートに分かる手法がないかお聞きしたいです。

2.INI等のメモリ化?
INIファイル等の外部アクセスをする際にメモリに取り込んでGetPrivateProfileString等を実行する、
または代替処理はないのでしょうか?
本題である高速化にあたるのですが、何か良い手段はないでしょうか?
※ 前提として既に提供している資産の活用があるため、
カンマ区切り等にするという手法が既存パラメータに対しては難しくなっています。

以上です、よろしくお願いします。

Re:INIファイルアクセスの高速化

Posted: 2010年11月20日(土) 16:55
by softya
1.に関しては内部で保持している方法が不明なので分かりません。
文字で全て保持するなら間違いとは言えないと思います。
スマートで凝った手段としては、一度そのまま1次バッファ(ファイルサイズ)に蓄えた後、保存方式に合わせてサイズを計算しつつ2次バッファに転送し直せばすっきりしますがメモリが大量にあるならこんなことをやる必要も無いですしバグのもとです。

2.1.で蓄えたバッファの内容をGetPrivateProfileStringで読み込んだかのようにして返す関数ですよね。
べつに難しくは無いと思いますが。
GetPrivateProfileStringの名前は代替え関数だよって意味で別の名前にした方が良いとは思います。

Re:INIファイルアクセスの高速化

Posted: 2010年11月20日(土) 18:01
by にゃこ
>softya様
回答ありがとうございます。

1についてはINIファイルの前提をテキストデータとして話しています。
確かにファイルサイズで取っているので二度手間でセクションに合わせたバッファを再確保するのは無駄ですね。

システム的にはメモリの使用量がまずいわけではないのですが、
複数のセクションを保持しているため今後キーが増えるとテキストとは言え1MBくらいは超えそうなので
あまり好き勝手に確保させたくないなぁと思っての質問でした。
高速化という名目もあるので、バッファ再確保でコストを落としては意味がないため
とりあえずファイルサイズで確保する仕様で固めたいと思います。

2に関しては内部メモリでセクション+キー名称をキーとしたマップを作ったりしてました。
ただ誰もがやりそうな事ゆえに既にあるのではないか?という内容でした。
テキスト故に好き勝手書かれてテキスト解析回りで落ちる原因になるのも怖かったので
何かしら既にあるものがあればそちらを使いかたかったという感じです。

何かしら情報はあるかもしれませんが、期限もありますので質問はここで解決とさせて頂きます。
ありがとうございました。