C# 垃圾收集器没有完成它的工作。内存消耗=1.5GB&OutOFMemory异常
你不也应该把你的尸体处理掉吗 我看到它被打开了:C# 垃圾收集器没有完成它的工作。内存消耗=1.5GB&OutOFMemory异常,c#,.net,C#,.net,你不也应该把你的尸体处理掉吗 我看到它被打开了: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO; using System.Drawing; using System.Drawing.Imaging; namespace TrainSVM { class Program {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
namespace TrainSVM
{
class Program
{
static void Main(string[] args)
{
FileStream fs = new FileStream("dg.train",FileMode.OpenOrCreate,FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
String[] filePathArr = Directory.GetFiles("E:\\images\\");
foreach (string filePath in filePathArr)
{
if (filePath.Contains("HBP"))
{
sw.Write("1 ");
Console.Write("1 ");
}
else
{
sw.Write("1 ");
Console.Write("1 ");
}
using (Bitmap originalBMP = new Bitmap(filePath))
{
/***********************/
Bitmap imageBody;
ImageBody.ImageBody im = new ImageBody.ImageBody(originalBMP);
using (imageBody = im.GetImageBody(-1))
{
/* white coat */
Bitmap whiteCoatBitmap = Rgb2Hsi.Rgb2Hsi.GetHuePlane(imageBody);
float WhiteCoatPixelPercentage = Rgb2Hsi.Rgb2Hsi.GetWhiteCoatPixelPercentage(whiteCoatBitmap);
//Console.Write("whiteDone\t");
sw.Write("1:" + WhiteCoatPixelPercentage + " ");
Console.Write("1:" + WhiteCoatPixelPercentage + " ");
/******************/
Quaternion.Quaternion qtr = new Quaternion.Quaternion(-15);
Bitmap yellowCoatBMP = qtr.processImage(imageBody);
//yellowCoatBMP.Save("yellowCoat.bmp");
float yellowCoatPixelPercentage = qtr.GetYellowCoatPixelPercentage(yellowCoatBMP);
//Console.Write("yellowCoatDone\t");
sw.Write("2:" + yellowCoatPixelPercentage + " ");
Console.Write("2:" + yellowCoatPixelPercentage + " ");
/**********************/
Bitmap balckPatchBitmap = BlackPatchDetection.BlackPatchDetector.MarkBlackPatches(imageBody);
float BlackPatchPixelPercentage = BlackPatchDetection.BlackPatchDetector.BlackPatchPercentage;
//Console.Write("balckPatchDone\n");
sw.Write("3:" + BlackPatchPixelPercentage + "\n");
Console.Write("3:" + BlackPatchPixelPercentage + "\n");
}
}
sw.Flush();
}
sw.Dispose();
fs.Dispose();
}
}
}
但我看不到您正在处理它/将其设置为null?您不也应该处理imageBody吗 我看到它被打开了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
namespace TrainSVM
{
class Program
{
static void Main(string[] args)
{
FileStream fs = new FileStream("dg.train",FileMode.OpenOrCreate,FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
String[] filePathArr = Directory.GetFiles("E:\\images\\");
foreach (string filePath in filePathArr)
{
if (filePath.Contains("HBP"))
{
sw.Write("1 ");
Console.Write("1 ");
}
else
{
sw.Write("1 ");
Console.Write("1 ");
}
using (Bitmap originalBMP = new Bitmap(filePath))
{
/***********************/
Bitmap imageBody;
ImageBody.ImageBody im = new ImageBody.ImageBody(originalBMP);
using (imageBody = im.GetImageBody(-1))
{
/* white coat */
Bitmap whiteCoatBitmap = Rgb2Hsi.Rgb2Hsi.GetHuePlane(imageBody);
float WhiteCoatPixelPercentage = Rgb2Hsi.Rgb2Hsi.GetWhiteCoatPixelPercentage(whiteCoatBitmap);
//Console.Write("whiteDone\t");
sw.Write("1:" + WhiteCoatPixelPercentage + " ");
Console.Write("1:" + WhiteCoatPixelPercentage + " ");
/******************/
Quaternion.Quaternion qtr = new Quaternion.Quaternion(-15);
Bitmap yellowCoatBMP = qtr.processImage(imageBody);
//yellowCoatBMP.Save("yellowCoat.bmp");
float yellowCoatPixelPercentage = qtr.GetYellowCoatPixelPercentage(yellowCoatBMP);
//Console.Write("yellowCoatDone\t");
sw.Write("2:" + yellowCoatPixelPercentage + " ");
Console.Write("2:" + yellowCoatPixelPercentage + " ");
/**********************/
Bitmap balckPatchBitmap = BlackPatchDetection.BlackPatchDetector.MarkBlackPatches(imageBody);
float BlackPatchPixelPercentage = BlackPatchDetection.BlackPatchDetector.BlackPatchPercentage;
//Console.Write("balckPatchDone\n");
sw.Write("3:" + BlackPatchPixelPercentage + "\n");
Console.Write("3:" + BlackPatchPixelPercentage + "\n");
}
}
sw.Flush();
}
sw.Dispose();
fs.Dispose();
}
}
}
但是我看不到您正在处理它/将其设置为null?有一些位图实例您没有处理。你真的应该试着养成使用using块的习惯,而不是手动处理,以防止这些东西从网络中溜走。那里有一些位图实例你没有处理。你真的应该试着养成使用using块的习惯,而不是手动处理,以防止这些东西从网络中溜走。尝试使用位图originalBMP=new-BitmapfilePath;在使用中
Bitmap imageBody;
ImageBody.ImageBody im = new ImageBody.ImageBody(originalBMP);
imageBody = im.GetImageBody(-1);
using子句中的所有内容在离开该子句后被明确处理。
您还可以在释放变量后将其设置为null。尝试获取位图originalBMP=new BitmapfilePath;在使用中
Bitmap imageBody;
ImageBody.ImageBody im = new ImageBody.ImageBody(originalBMP);
imageBody = im.GetImageBody(-1);
using子句中的所有内容在离开该子句后被明确处理。
您还可以在释放变量后将其设置为null。您应该尽可能使用using语句,而不是Dispose语句。这样,您可以立即在声明中看到您刚刚创建的实例已被释放 哪个更好
using (Bitmap originalBMP = new Bitmap(filePath)) {
// your code....
sw.Flush();
}
或
using语句还确保释放所有实例,即使您过早地使用return、break甚至异常离开当前块/方法
请注意,您可以将多个赋值放在using语句的开头 您应该尽可能使用using语句,而不是Dispose语句。这样,您可以立即在声明中看到您刚刚创建的实例已被释放 哪个更好
using (Bitmap originalBMP = new Bitmap(filePath)) {
// your code....
sw.Flush();
}
或
using语句还确保释放所有实例,即使您过早地使用return、break甚至异常离开当前块/方法
请注意,您可以将多个赋值放在using语句的开头 也许你被这个虫子咬了: 在本例中,添加
using (Bitmap bmp = new Bitmap(filePath))
{
// .. pages of code goes here ..
}
在循环中可能会有所帮助
或者使用sos.dll查看内存泄漏的位置。也许您被这个错误咬到了: 在本例中,添加
using (Bitmap bmp = new Bitmap(filePath))
{
// .. pages of code goes here ..
}
在循环中可能会有所帮助
或者使用sos.dll查看内存泄漏的位置。您有很多对各种类、ImageBody、Rgb2Hsi、BlackPatchDetection等的调用 我想这是你自己的代码。其中任何一个都可能占用资源 我建议你抓起一个分析器,运行一些测试 大多数都有试用版,给你几天的时间
您有很多对各种类的调用,如ImageBody、Rgb2Hsi、BlackPatchDetection等 我想这是你自己的代码。其中任何一个都可能占用资源 我建议你抓起一个分析器,运行一些测试 大多数都有试用版,给你几天的时间
如果您在此行中遇到异常:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
然后,这可能意味着您试图加载无效或损坏的图像文件。出于无人知晓的原因,OutOfMemoryException是本例中抛出的异常。事实上,这与真正的内存不足无关
尝试用谷歌搜索bitmap.fromfile outofmemoryexception。如果您在此行中遇到异常:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
然后,这可能意味着您试图加载无效或损坏的图像文件。出于无人知晓的原因,OutOfMemoryException是本例中抛出的异常。事实上,这与真正的内存不足无关
尝试用谷歌搜索bitmap.fromfileoutofmemoryexception。与任何垃圾收集问题一样,我的方法是开始注释内容,看看是否仍然可以重现内存泄漏。要尝试的东西: 仅实例化循环中位图的一个实例,以查看内存使用情况是否发生变化。 Dispose/not Dispose位图的一个实例,以查看Dispose是否有任何区别。
从我在最新版本的代码中可以看到,whiteCoatBitmap、yellowCoatBitmap和blackPatchBitmap没有被处理。用using块来包围它们。与任何垃圾收集问题一样,我的方法是开始注释,看看是否仍然可以重现内存泄漏。要尝试的东西: 仅实例化循环中位图的一个实例,以查看内存使用情况是否发生变化。 Dispose/not Dispose位图的一个实例,以查看Dispose是否有任何区别。
从我在最新版本的代码中可以看到,whiteCoatBitmap、yellowCoatBitmap和blackPatchBitmap没有被处理。也要用挡块将其包围。+1。当然,他应该这样做,巨大的图像未经处理永远不会是好的。处理它并将其设置为空是两种完全不同的做法
虽然我想你可能已经知道了,但我还是加上了。再次运行我的代码。我仍然收到这个错误。你补充了什么?你能更新你原来的帖子来反映你的改变吗?还有:为什么人们建议他处理这个ImageBody类而不知道它实际上做了什么?如果图像被传入,则没有明显的理由认为该类应该是一次性的。+1。当然,他应该这样做,巨大的图像未经处理永远不会好。处理它和将其设置为空是两件完全不同的事情,尽管我怀疑你可能已经知道了。我添加了它。再次运行我的代码。我仍然收到这个错误。你补充了什么?你能更新你原来的帖子来反映你的改变吗?还有:为什么人们建议他处理这个ImageBody类而不知道它实际上做了什么?如果图像被传入,则没有明显的理由认为该类应该是一次性的。事实上,使用块为您添加了一个try finally,并且您肯定知道他的代码缺少哪些。为什么要尝试finally?如果所有的一次性用品都在使用积木中,这些保证了无需使用积木即可调用Dispose。我想你误解了我,这是你从使用声明中得到的东西之一。我的意思不是说你需要使用块进行最终尝试,我的意思是你不需要使用块进行最终尝试对不起,我误读了add for,或者这可能是您的编辑?。这可能是,尽管我们一直意见一致:事实上,使用块为您添加了一个最终尝试,而且您肯定知道他的代码缺少哪些。为什么要最终尝试?如果所有的一次性用品都在使用积木中,这些保证了无需使用积木即可调用Dispose。我想你误解了我,这是你从使用声明中得到的东西之一。我的意思不是说你需要使用块进行最终尝试,我的意思是你不需要使用块进行最终尝试抱歉,我误读了add for,或者这是您的编辑?可能是,不管怎样,我们一直都同意:使用block更新代码。内存仍然不足。ImageBody类是什么?你能帮我发密码吗?没什么。它只有几个整数参数。@imageWorker-您添加的using语句会有所帮助,但您仍然没有处理从代码中复制的whiteCoatBitmap、YellowCoatTBMP和balckPatchBitmap拼写。是否有堆栈跟踪?使用using block更新了代码。内存仍然不足。ImageBody类是什么?你能帮我发密码吗?没什么。它只有几个整数参数。@imageWorker-您添加的using语句会有所帮助,但您仍然没有处理从代码复制的whiteCoatBitmap、YellowCoatBitmp和balckPatchBitmap拼写。您有堆栈跟踪吗?我还有一个问题:什么时候我应该将变量设置为null?当我离开他们的范围谈论当地人的时候,他们不是被收集了吗;通常情况下不需要它。关于这个主题我还有另一个问题:什么时候有变量,为什么我要设置为空?当我离开他们的范围谈论当地人的时候,他们不是被收集了吗;正常情况下不需要,这是个好主意。完全误导性的异常是我最喜欢的。@迈克:这种情况特别糟糕,因为图像文件往往是你在.Net中处理的最大对象之一,所以当你遇到OutOfMemoryException时,很容易认为你真的,你知道,内存不足。这是一个很好的异常。完全误导性的异常是我最喜欢的。@迈克:这种情况特别糟糕,因为图像文件往往是在.Net中处理的最大对象之一,所以当您遇到OutOfMemoryException时,很容易认为您真的内存不足。您的代码中还有很多未处理的图像。另外,你有没有看过ImageBody?这个类是从IDisposable派生的吗?如果是这样的话,您还应该处理它。您还应该使用.net memoryprofiler查看哪些对象消耗了这么多内存您的代码中还有很多未处理的图像。另外,你有没有看过ImageBody?这个类是从IDisposable派生的吗?如果是这样的话,您还应该处理它。您还应该使用.net memoryprofiler查看哪些对象消耗了这么多内存