Delphiで作成したアプリをずっと使い続けると、ある時「メモリが足りません」
というメッセージが出て、処理が中断されてしまいます。
このとき、このアプリが使用しているメモリ容量を調べると、アプリ起動時での
使用容量とほとんど変わりません。
OS側の物理メモリの利用可能容量も、やはりアプリ起動時での容量と
ほとんど変わらず、十分にあるのです。
それなのに、「メモリが足りません」というメッセージが出るのですが、
どういった原因が考えられるでしょうか?
環境はXPのSP2、Delphi5、CPUはAthlon64 3800+です。
エラーの内容も記憶が薄れており、ちょっと状況が違うかもしれませんが、
(たぶん)似たような状況になったことがあります。
とあるレコード型のデータをリスト化して保持するため、GetMem,FreeMemを使用し、
その都度メモリの取得・開放を行っているプログラムがありました。
計算途中には、けっこう大量のデータを処理することもあったので、
一時的にはメモリ使用量も増えますが、作業後にはきっちり開放するようにしていたので、
メモリ使用量は、増えっぱなしではありません。
ですが、とある段階でGetMemだったか、ほかのメモリ確保だったかで失敗し、
たしか「メモリ不足です」というメッセージが表示されました。
・大量のデータを扱ったとき限定で発生し、少ないデータでは発生しない。
・時間がかかる処理だったので、詳細まで追っていないが、概ね同じようなタイミングで発生(再現性あり)
・当時は、まだXPが発売されていない時で、NTか2000での使用
当時の解決策は、よくわからんだのですが、メモリの確保に問題があると見て、
必要な時に一件ずつメモリ確保していた部分を、ある程度まとめて所得してしまうように修正しました。
1回Getmem→処理→1回Getmem→処理→1回Getmem→・・・終了・・・→全てFreeMem
を
100回Getmem→処理→確保済みのメモリ使用→処理→確保済みのメモリ使用→・・・
のようにしました。
不思議です。
これだけで、ぴたりとエラーは発生しなくなりました。
以後同じようなエラーに悩まされたことはありません。
勝手にメモリの断片化による弊害と位置付けましたが、詳細は不明です。
ご回答、ありがとうございます。
そうですか〜メモリの断片化ですか〜。知りませんでした^^;
勉強になります。
そういえば、GetMemとFreeMemを万単位で繰り返しています。
しかも「数MB×いっぱい」分も・・・
コードのあらゆる場所で確保と開放を行っていますので、
いまさら一括確保、一括開放は現実無理っぽいです;;
メモリの断片化を解消するようないい方法はないでしょうか?
そういったソフトがあれば、それでもいいのですが・・・
> そうですか〜メモリの断片化ですか〜。知りませんでした^^;
勝手にそう思ってるだけで、本当にそれが原因なのかは知りませんです(^^ゞ
でも、GetMemとFreeMemでメモリの確保・開放を繰り返している点が似ているので、
原因としてはかなり臭いのですね。
ただ、同じようにメモリの確保・開放を繰り返す処理でも、発生しない場合があるので、
さらに深い要因があるのかもしれません。
ちなみに、メモリ断片化が発生しているとしたとき、それを解消する方法は知りません。
役立たずなレスでしたm(v_v)m
一週間ずっと悩んでたんですが、答えが以下にありました。
D5ではどーしよーも無いようです・・・
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=080495
それでは、皆様、よいお年を〜〜〜!!
D5でも使えるはずです。D2006並になると思います。
http://sourceforge.net/projects/fastmm/
deldel さん
> 一週間ずっと悩んでたんですが、答えが以下にありました。
> D5ではどーしよーも無いようです・・・
> http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=080495
むぅ、ほんとうにメモリ断片化だったということでしょうか・・・。
えーと さん
> D5でも使えるはずです。D2006並になると思います。
> http://sourceforge.net/projects/fastmm/
おぉ、こんなのがあったのですね(ヨクワカテナイケド)
エラーを再現させるコードがないのですが、
> http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=080495
ここで書いてある再現コードで試してみればいいのかな?
で、よいお年を〜
えーとさん、ありがとうございます。
思いっきり解決しました。
しかもメモリアクセスも2倍くらい速くなりました。
年始から縁起がよくて、喜んでいます。
ツイート | ![]() |