C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

なぜかメモリーが足りなくなる

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■91796 / inTopicNo.1)  なぜかメモリーが足りなくなる
  
□投稿者/ カレー (1回)-(2019/08/04(Sun) 14:28:27)

分類:[.NET 全般] 

1920x1180の動画ファイルから8フレームの画像ファイルを抽出し
画像の平均化するプログラムをVB.NETで作成しました。

画像ファイルの抽出はFFMpegを使っています。

そして処理はGUIスレッドではなく
バックグラウンドで行っています。

問題なく動作しているのですが、
5〜10回くらい繰り返すと、

バイトデータの合計値を格納するための以下の配列で

ReDim Byte_Sum(ThreadNum_1, bsize - 1)

{"種類 'System.OutOfMemoryException' の例外がスローされました。"}

というエラーが出てしまいます。

ThreadNum_1は7が格納されており、
bsizeには6796800が格納されています
そのため、配列サイズは1.8 MByteということになります。
10回繰り返しても18 MByteにしかならないので、
2 GByteには到達していないと思います。

また、タスクマネージャーで確認しても
プログラムのメモリ使用量は550 MByte程度になっており、
それ以上増えないのですが。

一応、処理の最後に
Byte_Sum = Nothing
を入れてメモリ解放処理を行ってみたのですが、
やはりこのエラーが出てしまいます。


一体何が原因でしょうか?



引用返信 編集キー/
■91800 / inTopicNo.2)  Re[1]: なぜかメモリーが足りなくなる
□投稿者/ KOZ (19回)-(2019/08/04(Sun) 18:07:59)
No91796 (カレー さん) に返信
> ReDim Byte_Sum(ThreadNum_1, bsize - 1)

処理を見てみないとわからないですが、一回の処理で何回呼び出していますか?

ReDim は新しく領域を作り出すので、それまで使っていた領域は GC が走るまで解放されません。

処理が終わって Nothing した後、

GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()

とすると、解消するかもしれません。
引用返信 編集キー/
■91801 / inTopicNo.3)  Re[1]: なぜかメモリーが足りなくなる
□投稿者/ Hongliang (849回)-(2019/08/04(Sun) 18:28:19)
> ThreadNum_1は7が格納されており、
> bsizeには6796800が格納されています
> そのため、配列サイズは1.8 MByteということになります。

6796800バイトは大体6.5Mバイト。その8倍なので 52MB ぐらい確保してますが。

メモリを大量に使うコードを書く場合、「一時的にメモリを大量消費する部分」を別プロセスに分けてしまうのも一案です。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ