C# 系统内存不足,但我没有保存任何东西,所以如何保存?
我在运行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
//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