1

このトピックに関するSOの質問/回答をいくつか読みましたが、さらに混乱しました。契約は次のとおりです。

ディスクから多くの画像を読み取るアプリケーションがあります。それだけのバイト数を読み取るのに十分なRAMがありますがSystem.OutOfMemoryException、データの処理を開始する前であっても、データの読み取り中に取得します。

基本的に、私の読書プロセスは次のとおりです。

class Image
{
    float[,] pixels;
}

public static void ReadImages()
{
    List<Image> images = new List<Image>();
    for(int i=0;i<length;i++)
    {
         Image image = ReadImageFromDisk(); // Reads image from the disk.
         if ( Do I need this image? ) // Check whether to store on the memory or not
         {
              images.Add(image);
         }
    }
}

私が使用する理由は、基本的に、メモリに保存するList<Image>数がわからないためです。Imageディスクからを読み取り、Imageそのイメージをメモリに保存するかどうかを決定します。

基本的なメモリ計算を行う:

= 28 (image width) x 28 (image height) x 4 (float) x 500,000 (number of images)
= 1568000000 bytes = 1.568 Gigabyte

私は 64 ビットの Windows 7 を使用しており、16 ギガバイトの RAM がインストールされています。OutOfMemory例外が発生するのはなぜですか?

4

2 に答える 2

0

ReadImageFromDisk 関数が何をするのかを正確に知らなくても、私の最初の推測では、管理されていないリソース、つまりファイル システムへのアクセスに関するリソースを適切に破棄していない可能性があります。

未処理のファイル システム ハンドルが 50 万個ある場合 (イメージを Image オブジェクトに読み込むために使用されるメモリ ストリームは言うまでもありません)、OOM 例外が発生する可能性が高くなります。

于 2013-02-12T20:37:37.697 に答える
0

x86-64 ビット CPU 用にビルドする .NET プロジェクトをターゲットにしていますか?

OOM 例外が発生した場所を正確に見つけるためにデバッグを行いましたか。

Process proc = System.Diagnostics.Process.GetCurrentProcess();
List<Image> images = new List<Image>();
for(int i=0;i<length;i++)
{
    /* DEBUG */
    if((i % 1000) == 0) Console.WriteLine("Image#: " + i + " " + proc.WorkingSet64);
于 2013-02-12T20:39:19.237 に答える