C# 系统内存不足,但我没有保存任何东西,所以如何保存?

C# 系统内存不足,但我没有保存任何东西,所以如何保存?,c#,C#,我在运行C#控制台应用程序时遇到了一个奇怪的错误 //get trainingimages var trainingImages = Directory.GetFiles( "C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017_Training_Data\\ISIC-2017_Training_Data", "*.jpg" ).ToL

我在运行C#控制台应用程序时遇到了一个奇怪的错误

//get trainingimages
var trainingImages = Directory.GetFiles(
   "C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017_Training_Data\\ISIC-2017_Training_Data",
   "*.jpg"
).ToList();

for (var i = 0; i < trainingImages.Count; i++)
{
   var image = Image.FromFile(trainingImages[i]);
   var vsImage = ConvertBitmap(new Bitmap(image));

   //cnvert to 2d array
   var imgArray = new int[vsImage.Width, vsImage.Height, 3];

   for (var j = 0; j < vsImage.Width; j++)
      for (var z = 0; z < vsImage.Height; z++)
      {
         var p = vsImage.GetPixel(j, z);
         imgArray[j, z, 0] = p.R;
         imgArray[j, z, 1] = p.G;
         imgArray[j, z, 2] = p.B;
      }
}

我的一个应用程序也有同样的问题。调用FromFile方法时使用
using
。 而不是:

 var image = Image.FromFile(trainingImages[i]);
使用:

使用(var image=image.FromFile(trainingImages[i]))
{
使用(var位图=新位图(图像))
{
使用(var vsImage=ConvertBitmap(位图))
{
//cnvert到2d阵列
var imgArray=newint[vsImage.Width,vsImage.Height,3];
对于(var j=0;j

这就是为什么会出现内存异常,因为图像对象没有被处理或者处理得太晚。

在我的一个应用程序中也有同样的问题。调用FromFile方法时使用
using
。 而不是:

 var image = Image.FromFile(trainingImages[i]);
使用:

使用(var image=image.FromFile(trainingImages[i]))
{
使用(var位图=新位图(图像))
{
使用(var vsImage=ConvertBitmap(位图))
{
//cnvert到2d阵列
var imgArray=newint[vsImage.Width,vsImage.Height,3];
对于(var j=0;j

这就是为什么会出现内存异常的原因,因为图像对象没有被处理或者处理得太晚。

请记住,内存不足异常可能是因为图形对象的句柄用完了,而不仅仅是普通的旧RAM

您需要处理所有的
IDisposable
。在代码中,有三个对象需要为循环的每次迭代处理

您的代码应该如下所示:

public static Bitmap ConvertBitmap(Bitmap image)
{
   // Convert other formats (including CMYK) to RGB.
   var newImage = new Bitmap(newWidth, newHeight);

   // Draws the image in the specified size with quality mode set to HighQuality
   using (var graphics = Graphics.FromImage(newImage))
   {
      graphics.DrawImage(image, 0, 0, newWidth, newHeight);
   }

   return newImage;
}
//get trainingimages
var trainingImages = Directory.GetFiles(
   "C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017_Training_Data\\ISIC-2017_Training_Data",
   "*.jpg"
).ToList();

for (var i = 0; i < trainingImages.Count; i++)
{
    using (var image = Image.FromFile(trainingImages[i]))
    {
        using (var bm = new Bitmap(image))
        {
            using (var vsImage = ConvertBitmap(bm))
            {
                var imgArray = new int[vsImage.Width, vsImage.Height, 3];
                for (var j = 0; j < vsImage.Width; j++)
                {
                    for (var z = 0; z < vsImage.Height; z++)
                    {
                        var p = vsImage.GetPixel(j, z);
                        imgArray[j, z, 0] = p.R;
                        imgArray[j, z, 1] = p.G;
                        imgArray[j, z, 2] = p.B;
                    }
                }
            }
        }
    }
}
//获取训练图像
var trainingImages=Directory.GetFiles(
“C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017\u Training\u Data\\ISIC-2017\u Training\u Data”,
“*.jpg”
).ToList();
对于(var i=0;i
请记住,内存不足异常可能是因为图形对象的句柄已经用完,而不仅仅是普通的旧RAM

您需要处理所有的
IDisposable
。在代码中,有三个对象需要为循环的每次迭代处理

您的代码应该如下所示:

public static Bitmap ConvertBitmap(Bitmap image)
{
   // Convert other formats (including CMYK) to RGB.
   var newImage = new Bitmap(newWidth, newHeight);

   // Draws the image in the specified size with quality mode set to HighQuality
   using (var graphics = Graphics.FromImage(newImage))
   {
      graphics.DrawImage(image, 0, 0, newWidth, newHeight);
   }

   return newImage;
}
//get trainingimages
var trainingImages = Directory.GetFiles(
   "C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017_Training_Data\\ISIC-2017_Training_Data",
   "*.jpg"
).ToList();

for (var i = 0; i < trainingImages.Count; i++)
{
    using (var image = Image.FromFile(trainingImages[i]))
    {
        using (var bm = new Bitmap(image))
        {
            using (var vsImage = ConvertBitmap(bm))
            {
                var imgArray = new int[vsImage.Width, vsImage.Height, 3];
                for (var j = 0; j < vsImage.Width; j++)
                {
                    for (var z = 0; z < vsImage.Height; z++)
                    {
                        var p = vsImage.GetPixel(j, z);
                        imgArray[j, z, 0] = p.R;
                        imgArray[j, z, 1] = p.G;
                        imgArray[j, z, 2] = p.B;
                    }
                }
            }
        }
    }
}
//获取训练图像
var trainingImages=Directory.GetFiles(
“C:\\Users\\tub08918\\Google Drive\\Patil Lab\\AlexsFolderPleaseVisitMe\\ISIC-2017\u Training\u Data\\ISIC-2017\u Training\u Data”,
“*.jpg”
).ToList();
对于(var i=0;i
奇怪吗?我想说的是,这是预期发生在这段代码。在不处理一次性物品的情况下制造一次性物品。用所有图像中的所有字节填充一个数组,如果你有很多图像,这可能会占用大量内存。嗯,我以为每次退出循环时都会处理这些字节。那么如何处理每个映像?该错误可能表示您正在访问映像边界之外的内存位置。我将首先验证图像的宽度和高度是否有效。这些数字应该是标准的图像大小。“但我不会保存任何内容,所以如何保存”。”“内存”指的是RAM,而不是硬盘空间。这将取决于你有多少个大小的图像。1001000x1000个图像将消耗大约100*1000*1000*3*4=1.2GB的RAM。(这只是你的数组)。@woofwoof要么使用
使用
(然后一次性对象将在使用块的末尾被处理),要么手动处理对象。奇怪吗?我想说的是,这是预期发生在这段代码。在不处理一次性物品的情况下制造一次性物品。用所有图像中的所有字节填充一个数组,如果你有很多图像,这可能会占用大量内存。嗯,我以为每次退出循环时都会处理这些字节。那么如何处理每个映像?该错误可能表示您正在访问映像边界之外的内存位置。我将首先验证图像的宽度和高度是否有效。这些数字应该是s