[[20220915172056]] 『メモリの監視方法』(エルモア) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『メモリの監視方法』(エルモア)

 自ブックまたはアプリケーションで使用しているメモリのログをとる方法を探しています

 以前作成したブックでよくメモリ不足ですとエラーが出ると問い合わせがあるのですが、どこが悪いのか洗い出すためにメモリの監視を行いたいと思っています
 とりあえずボタンか何かを押した際にどれくらい使用しているか都度記録するくらいでいいと思っているのですが
 そのブックやアプリが使用しているメモリをどう特定するのかわからず困っています(昔はApplication.MemoryUsed等が使えたそうですが・・・)
 どなたかわかる方おられませんか?

 参考にそのブックの処理として以下の処理を行っています
 1.FileSystemObjectを使用しテキストファイルを読み込む
 2.読み込んだ内容をシートに書き込む
 3.3Mほどの画像を背景として読み込む
 4.テキストファイルの情報をもとに条件付き書式で画像を背景としたシートを2色で色分けする
 5.テキストファイルに任意の加工を施し保存する
 6.読み込んだテキストの内容をClearContentsする
 7.画像を読み込んだシートの背景を.SetBackgroundPicture("")で背景を消す
 8.1から7までを繰り返す

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 あー、どうですかねぇ...

 >メモリ不足ですとエラーが出る
 って場合、
 RAMとかPageFileとかは勿論、Excel自身の仮想メモリ空間におけるMemoryUsageも
 ほとんど関係なかったりするんで、
 そこを追及しても解決の糸口は見えてこない事の方が多いんですよね。

 大量のスパークラインを設定したシートをフィルタで絞り込んだ時
 とか、
 リンクされた図を大量に貼り付けたシートを丸ごとコピーした時
 とか、
 背景に超高解像度の写真をタイリングしたシートでZoomを50%にした時
 とか

 グラフィック系の処理では割と生じ易い現象です。

 「メモリ不足」≒「量が多過ぎた」ってニュアンスだと思うんですけど、
 表面化するのって多分「一瞬」なんだと思います。
 つまり「(瞬間的に動かそうとしているパーツの)量が多い」って感じなんだと思います。

 なので
 処理を時間的に分散させる。とか
 パーツの総量を減らす。とか
 そういった試行錯誤で限界を探っていく事になると思います。
 (しかも別環境でも大丈夫な所を探さないといけない)

 ちなみに本当にメモリ情報を採るんなら、
 APIのGetProcessMemoryInfoとかでWorkingSetSizeの推移を記録していく感じだと思うんですけど、
 問題のマクロと同一プロセス上で非同期実行出来ないですから、
 結局肝心なタイミングの記録が取れないで終わっちゃう可能性が高いと思います。

(白茶) 2022/09/15(木) 19:17


 メモリ監視ではないですが、メモリ不足対策するにあたってです。

 私ならですが、
 どのブロックで止まるか絞り込むため、
 イミディエイトウィンドウにブロックのスタート、エンドで、
 必要な情報を吐き出して、止まった時に確認します。

 あとは、ループの中、配列、オブジェクトを含む変数を
 都度初期化するとか。

 ポイントにDoEnentsやSleepを入れたりもします。

(tkit) 2022/09/16(金) 08:13


 そうですか・・・
 処理を繰り返すと書いてありますが1〜8までの間に人によるチェック作業を挟むので2〜3分ほど猶予があります(5の部分)加え1 -> 8の間にも人がファイルを選択する時間があるので2,3秒の猶予があります
 なので短時間でループしすぎってことはないと思うのですが、処理を数十回繰り返すとシート背景に画像を読み込むタイミングでメモリ不足のアラートが出て画像を読み込めないんですよね・・・

 シートにある画像も背景に置いてある画像のみで数式は他のシートをただ参照している(=Sheet1!A1とか)だけなので重い処理といったら後はA1:EA95に入っている条件付き書式くらいですかね・・・(シート内の書式は;;;なので値も見えず色だけを付与しています)

 とりあえず自身の環境でもう一度メモリを開放し忘れていないか等の確認を行ってみます(パーツはもうかなり減らしていると思うので・・・)
(エルモア) 2022/09/16(金) 08:56

 Excel ブックをクリーンアップして使用メモリを減らす方法
 https://docs.microsoft.com/ja-jp/office/troubleshoot/excel/clean-workbook-less-memory

 書式設定が増えるとメモリをくっちゃうみたいなので、
 同じブックを再利用しないで、保存したら閉じてまた新しいブックを作った方が
 安全なのではないかと思います
(´・ω・`) 2022/09/16(金) 09:01

 そのブック自体は入力ツールとして使用していてそのブック自体を上書きしたりすることはありません
 なので開きなおせば作成時と同じ状態になっるとおもうので新規ブックを作るという事はしていませんね

 とりあえず(´・ω・`)さんが示されているその際とも参考に軽量化してみます
(エルモア) 2022/09/16(金) 09:14

Doevents とか書いてあるんすかね?
あれば私からの疑問は終わり。
(2209) 2022/09/16(金) 10:37

 >参考にそのブックの処理として以下の処理を行っています
 仮想メモリー不足?

(???) 2022/09/16(金) 10:43


 >Doevents とか書いてあるんすかね?
 繰り返し処理はしていますがdo/while~loopやfor~nextで回しているわけではないので入れていません
 入れるなら画像をどこに入れましょうかね?

 >仮想メモリー不足?
 実装メモリが4G(多分DDR3) / CPU:Core i5-4590 / 仮想メモリ:3504MB
 システムで2G使ってるんで心もとないと言えば心もとないかもしれませんね
(エルモア) 2022/09/16(金) 11:25

 >開きなおせば作成時と同じ状態
 そうですか、そのようには読めなかったので。

 >6.読み込んだテキストの内容をClearContentsする
 >7.画像を読み込んだシートの背景を.SetBackgroundPicture("")で背景を消す
 なんのために ClearContents したり、背景画像を消したりしてるんですか?
 まったくの無駄では?
(´・ω・`) 2022/09/16(金) 11:37

 >なんのために ClearContents したり、背景画像を消したりしてるんですか?
 確かに無駄かもしれませんが人の手が介在し以下のような作業をしているので念のため消しています

 もう少し作業を細かく紹介すると
 ブックは3つのシートで構成されています
 シート1にファイル名のリストを表示し、人がそのリストから処理するファイルを選択します(ファイル名は別途用意されているテキストファイルを読み込み、その内容を羅列しています)
 選択されたファイル名に対応した画像をシート2の背景に設定しシート3にはその画像に対応した情報を別のテキストファイルから読み込み書き出しシート2を表示します
 (テキストファイルはcsvであり内容は2次元配列に格納した後指定セルの範囲に書き出すというものです)
 シート2で人が画像を確認し異常点を発見したらその場所にマーキングを行います
 (Selection_Changeイベントを使用して選択されたアドレスを取得しそれに対応した情報をシート3に書き加えます)
 作業完了後シート3の内容をテキストファイルに書き出しシート2の背景を削除、シート2のデータをクリアし、シート1へ戻ります
 その際テキストファイルの内容を読み込みマーキングした個数とマーキングされていない個数とファイルの更新日時をファイル名の横に記載します
 (この際シート1に書き出してあるファイルの更新日時と実際のファイルの更新日時を比較して実際のファイルの更新日時のほうが新しければ上記と同じ処理をする事をシート1に書いてあるすべてのファイルに行います)
 そしてまたファイルを選びなおします

 この作業を繰り返す感じです
(エルモア) 2022/09/16(金) 15:42

 コードの提示が無いので、憶測でのアドバイスしか出来ません。
 それぞれ、マクロ実行の起点は、Selection_Changeなどのイベントですか?
 マクロ実行中に、イベントが発生した場合、そのイベント後の処理を回避する作りになっていますか?

 イベントが繰り返すような処理になっていたりする場合があるので、
 ActiveXコントロールのボタンなら、処理ブロックが走る前にボタンをdisableにしたり、
 Changeイベント系なら、モジュールレベル変数でフラグを設けて、処理が重複しないようにしますが、
 どうでしょうか。
(tkit) 2022/09/20(火) 09:06

 説明を読んでも全然イメージがわかないので降参します。
(´・ω・`) 2022/09/20(火) 15:09

Erase 配列
メモリの断片化
(不明) 2022/09/20(火) 16:27

メモリを増やせば。
(5\M3) 2022/09/20(火) 17:01

 >  実装メモリが4G(多分DDR3) / CPU:Core i5-4590 / 仮想メモリ:3504MB
 >  システムで2G使ってるんで心もとないと言えば心もとないかもしれませんね
 Excel2007/Win7でそれなら大丈夫だと思いますよ。
 それ以上増やしても意味ないですからそこは気にしないでも良い(というかしても仕方ない)でしょう。

 PageFileの事を「仮想メモリ」と表現することもあるので紛らわしいですが、
 Excelが「パソコンのメモリが足りないよ」という意味のメッセージを出す事は無いと思います。
 だってExcelのプロセスからはパソコンのメモリ状況なんて見えないですし、
 仮に見えても、それを警告するのはExcelじゃなくってOSのお仕事です。

 なので不足を疑う場合、ここでは↓こっちの意味だと思うのですが... (私の予想では今回はこれでもない)
仮想アドレス領域 - Windows drivers | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/gettingstarted/virtual-address-spaces
仮想アドレスとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word14343.html

 例えば、APIのGlobalMemoryStatusで取れるdwTotalVirtualは
 呼び出し元プロセスに関連付けられた仮想アドレス領域の総量(つまり2GB)、
 dwAvailVirtualはその内、予約もコミットもされていない量を返すらしいです。

 興味があるなら試しに計測してみても良いのではないかと思いますが、
 計測してもほとんど変動は見られないと思います。
 本件の様なマクロの実行中に枯渇するものではないかなーって。
 (↑は私の勝手な想像です。まあ、読み込んでるcsvファイルが実は2GBとかだったら知らんけど ^^;)

 ※  ※  ※

 >メモリ不足ですとエラー
 たぶん正式には「メモリ不足です。完全に表示できません」というメッセージだったのだと思います。
 このメッセージボックスのタイトルバーは「Microsoft Excel」と表記されていると思われます。(Excelが発したメッセージ)

 これ「完全に表示できません」がメイン(主文)なんですよね。結局は描画に関するエラーなんです。
 (64bitマシンでは起こらないと言われているけどホントなのかなぁ...?)

 一般的にイメージするメモリ不足の場合は
 「コンピューターのメモリが不足しています」という感じのメッセージボックスで警告される事が多い気がしますね。
 この場合メッセージボックスのタイトルバーは「Microsoft Windows」等、OSが発しているメッセージだと思います。

 んで、元々正常に機能していたマクロなのであれば、ココへ来て突然メモリ不足ってのも考え難いです。
 なのでひとまずパソコンのメモリの方は気にしないで良いと思ってま〜す。

(白茶) 2022/09/20(火) 22:17


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.