DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メモリの残り使用可能量を求めたいです

環境/言語:[VB.NET2010]
分類:[.NET]

お世話になります。

大きな画像ファイルを多数扱うプログラムを作っています。
フォルダのすべての画像を読み込ませる処理があり
その際に、数フォルダ分の画像群を読ませると、
メモリオーバーで、例外が発生してプログラムが停止してしまいます。

例外をキャッチしようと思っているのですが
そのシステムは、アプリケーション全体の例外をキャッチすると
ログをはいて落ちるようにくまれていて、
その部分は自分が組んだわけではないので、
未知数な面がまだ多く、調べきれていません。

個々のオブジェクト確保時にtry catchで
例外を取得することはできます。


そのファイルの一つの大きさは予想できるので
ファイル数が求まれば、使用メモリ容量も予想できるのですが
現在、アプリケーションがどのくらいメモリを使っているのか、
もしくは、どのくらいメモリを使えるのか、
ということと、
OS上であとどのくらいのメモリが使用できるのか、というような
計算方法がわかりません。

Windows7(やそれ以前)の32bit版での動作を対象としていまして
32bitのプログラムだと1つのアプリケーションが2GBのメモリ領域しか
確保できないというような話もあったような気がしています。


アプリケーションの
メモリ残り使用可能量の求め方や
OSのメモリ残り使用可能量
などの求め方をご存じの方、ご経験のあるかた、
教えていただきたいです。

遅くなるので、システムキャッシュ
(これはディスクにメモリを退避しているんですよね。)はあまり使いたくないので
できれば、これ以下はシステムキャッシュ入らず、これ以上使うとシステムキャッシュを使ってしまう、
というようなデータも取得できたらなと思います。

ユーザーには
「メモリが足りないのでこのフォルダの画像群は開けません」
というような通知をして、
開かせないようにしようと思っています。
■No30341に返信(FutoNekoさんの記事)

Process.GetCurrentProcess
で実行中のプロセスのProcessオブジェクトが取得出来るので
後はそのなかのプロパティをいろいろ参照すると良いかと思います。

MSDN - Process.PagedMemorySize64
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.pagedmemorysize64.aspx
2012/04/17(Tue) 16:43:15 編集(投稿者)

ありがとうございます。

次の記事もありました。
VB.NETでサクッとメモリ使用量を計測する
http://d.hatena.ne.jp/qaz76/20120119/1326980029

勉強させていただきます。

アプリケーションのメモリ残り使用可能量の求め方や
OSのメモリ残り使用可能量などの求め方
の具体的な記述が、調べないとまだわかってないので、
まだ、解決済み、にしないでおきます。


■No30342に返信(shuさんの記事)
> Process.GetCurrentProcess
> で実行中のプロセスのProcessオブジェクトが取得出来るので
> 後はそのなかのプロパティをいろいろ参照すると良いかと思います。
>
> MSDN - Process.PagedMemorySize64
> http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.pagedmemorysize64.aspx
■No30345に返信(FutoNekoさんの記事)

どのような処理を行っているか分かりませんが、適宜画像データをDisposeすることは出来ないのでしょうか?
他のソフトにも影響のあることなので、設計の見直しも重要かと思います。
2012/04/18(Wed) 22:55:27 編集(投稿者)

使用可能なメモリをあらかじめ求めてそれでガードするという手法は、実際のところ完璧にはなりませんので、事前チェックだけで済むと考えないでください。

プロセス内のメモリ空間で空きがあったとしても、必要な連続領域が空いておらずに確保できないと言うことがあり得ます。(メモリ空間は断片化するもの)
たとえば、メモリが 200MB 使えると報告されても、連続した空き領域としては 100MB + 100MB という状況だったとした場合、150MB のメモリ確保に失敗します。

事前チェックを実装したとしても、実際にメモリ確保する際に例外が発生してそれでユーザーに通知する仕組みも一緒に実装することが必要です。

【考えられる選択肢】
(1)事前チェックを実装するとともに、確保する際の例外もキャッチしてエラー通知する仕組みを実装する。
(2)事前チェックは実装せず、確保する際の例外をキャッチしてエラー通知する仕組みを実装する。
(3)事前チェックだけにして、断片化していた場合は例外で落ちる、ログ出力するを容認する  →さすがにないよね…?

もし、事前チェックだけで大丈夫だと思っていて調査されているのであれば、軌道修正も考えてください。
ユーザーは不便かもしれませんが、(1)よりは(2)の実装工数の方が少ないでしょうから。
非常に適切なアドバイス、ありがとうございます。
事前チェックよりかは例外処理で対応しようと思います。


■No30355に返信(Azuleanさんの記事)
> 2012/04/18(Wed) 22:55:27 編集(投稿者)
>
> 使用可能なメモリをあらかじめ求めてそれでガードするという手法は、実際のところ完璧にはなりませんので、事前チェックだけで済むと考えないでください。
>
> プロセス内のメモリ空間で空きがあったとしても、必要な連続領域が空いておらずに確保できないと言うことがあり得ます。(メモリ空間は断片化するもの)
> たとえば、メモリが 200MB 使えると報告されても、連続した空き領域としては 100MB + 100MB という状況だったとした場合、150MB のメモリ確保に失敗します。
>
> 事前チェックを実装したとしても、実際にメモリ確保する際に例外が発生してそれでユーザーに通知する仕組みも一緒に実装することが必要です。
>
> 【考えられる選択肢】
> (1)事前チェックを実装するとともに、確保する際の例外もキャッチしてエラー通知する仕組みを実装する。
> (2)事前チェックは実装せず、確保する際の例外をキャッチしてエラー通知する仕組みを実装する。
> (3)事前チェックだけにして、断片化していた場合は例外で落ちる、ログ出力するを容認する  →さすがにないよね…?
>
> もし、事前チェックだけで大丈夫だと思っていて調査されているのであれば、軌道修正も考えてください。
> ユーザーは不便かもしれませんが、(1)よりは(2)の実装工数の方が少ないでしょうから。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板