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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91796 の関連記事表示

<< 0 >>
■91796  なぜかメモリーが足りなくなる
□投稿者/ カレー -(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
    を入れてメモリ解放処理を行ってみたのですが、
    やはりこのエラーが出てしまいます。


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


親記事 /過去ログ158より / 関連記事表示
削除チェック/

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

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

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

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

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

    とすると、解消するかもしれません。
記事No.91796 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91801  Re[1]: なぜかメモリーが足りなくなる
□投稿者/ Hongliang -(2019/08/04(Sun) 18:28:19)
    > ThreadNum_1は7が格納されており、
    > bsizeには6796800が格納されています
    > そのため、配列サイズは1.8 MByteということになります。

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

    メモリを大量に使うコードを書く場合、「一時的にメモリを大量消費する部分」を別プロセスに分けてしまうのも一案です。
記事No.91796 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -