Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 垃圾收集器没有完成它的工作。内存消耗=1.5GB&OutOFMemory异常_C#_.net - Fatal编程技术网

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查看哪些对象消耗了这么多内存