如何处理内存堆栈过载
我想编写一个边缘检测方法。我已经使用emgucv Image类。因为我需要的灰度值我已经宣布它作为如何处理内存堆栈过载
Image<Gray,float> MyImage = new Image<Gray,float>;
我选择一个图像,并指定其像素值到MYIMAGE作为
public void selectImage()
{
OpenFileDialog opp = new OpenFileDialog();
if (opp.ShowDialog() == DialogResult.OK)
{
MyImage = new Image<Gray,float>(opp.FileName);
InputArray = new Image<Gray, float>(opp.FileName);
Convert.ToString(MyImage);
pictureBox1.Image = MyImage.ToBitmap();
}
}
当我点击边缘检测按钮,它调用主递归函数
private void detect_edges_Click(object sender, EventArgs e)
{
hueckel_operator(1, 1);
}
这种操作重复本身5pixel间隔。换句话说,我通过将x参数增加5来在x轴上应用它,在行的末尾我将y轴增加5,依此类推。
在hueckel_operator,其中再次计算一个非常沉重的公式被称为8次函数“一()”。这里是a()函数
public double a(int j, int counter6, int counter7)
{
for (int II = 0; II <= j ; II++)
{
for (KK = 1; KK < 70; KK++)
{
x_value = input_i_x(KK); //this function brings the x coordinate
y_value = input_i_y(KK); // this function brings the y coordinate
result += HueckelDisk(x_value,y_value,j) * MyImage[x_value+counter6, y_value+counter7].Intensity;
//MyImage.Dispose();
}
}
return result;
}
但问题是大约在坐标(75,5)它引发堆栈溢出异常。我用性能分析调试它,MyImage似乎吃掉所有的内存。你可能想看到递归函数,但由于它太大,我不能把它放在这里,我相信递归函数(hueckel_operator())不能达到终止条件,因为我发现它被调用了多少次。我想要的是找出是否有另一种方式来更有效地计算“结果”。
我的另一个问题是,对象MYIMAGE在功能使用的()69 *进行j次?它意味着它分配内存空间,69 *进行j次每当()被调用?在我绝望的尝试期间,为了减少内存使用,我已经声明和定义了几乎所有的变量作为全局变量,因为除非调用hueckel_operator()和a(),否则本地变量会在堆栈中分配额外的内存一遍又一遍,这是一个好的还是必要的方法?
我用4个非常嵌套,重功能,我不使用任何类。这会是主要问题吗?说实话,我没有看到任何东西可以转化为课堂。
我知道,我都问了太多问题,但我真的绝望了现在。自从几周以来,我正在阅读文章,我想我需要一个开始。任何帮助,将不胜感激。
堆栈溢出异常并没有真正有很多工作要做,内存使用情况 - 这是从堆栈使用。在你的情况下,递归调用。
递归只能走这么深,直到堆栈耗尽。一旦发生这种情况,你的堆栈溢出。
如果不在无限递归,但你需要更进一步,你可以当你创建一个线程指定堆栈大小,并运行在您的递归函数:
var stackSize = 10000000;
var thread = new Thread(new ThreadStart(StartDetection), stackSize);
然而,默认大小是1MB - 对于大多数任务来说这是相当多的。您可能需要验证您的递归实际上并未解除绑定,或者您无法减少或移除它。
确定这似乎解决我的问题,但我必须先了解它,因为我不知道在哪里把它或者写什么,而不是“开始检测”(可能命名功能)。我也宁愿修改我的算法,但我真的没有时间,我不知道,也许它不是无限的,你说 – mctuna 2012-07-09 13:40:00
是'StartDetection'在我的例子是一些函数的名称(可能只会有一个行:'hueckel_operator(1,1);') – 2012-07-09 13:52:00
太谢谢你了 – mctuna 2012-07-09 14:03:32