1

我已经阅读了几个关于这个主题的问题/答案,但是它们让我更加困惑。这是交易:

我有一个从磁盘读取许多图像的应用程序。即使我有足够的 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 GB 的 RAM。为什么我得到OutOfMemory异常?

4

2 回答 2

0

在不确切知道 ReadImageFromDisk 函数的作用的情况下,我的第一个猜测是您可能没有正确处理非托管资源,即访问文件系统的资源。

如果您有 500k 未处理的文件系统句柄浮动(更不用说用于将图像读入 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 回答