【问题标题】:How to increase stack size in C#? 1MB is not enough. I have 32GB of RAM available [duplicate]如何在 C# 中增加堆栈大小? 1MB 是不够的。我有 32GB 的可用 RAM [重复]
【发布时间】:2015-10-27 16:42:21
【问题描述】:

我在 bmp 中有以下用于“blob 填充”的代码。但是,它在循环 7201 或类似的地方耗尽了堆栈上的内存。如何增加内存?我听说堆栈大小是 1MB,这太小了!我有 32GB 内存,我想充分利用它。如果我的堆栈不是太微不足道,递归似乎就是这样的算法。 (这是一种四向递归;每个函数调用都会产生四个相同的函数调用)

public HashSet<int> evalpxls = new HashSet<int>();

public String addLikePixels(int r, int c, Byte A, Byte R, Byte G, Byte B, Bitmap bmp)
        {
            reclvl++;
            dl("Try r:" + r+ " c:" + c + " reclvl:"+reclvl);
            if (evalpxls.Contains(hash(r,c)) || r>=bmp.Height || c>=bmp.Width || r<0 || c<0) return "";
            evalpxls.Add(hash(r, c));
            var p = bmp.GetPixel(c, r);

            String curpix = "[" + r + "," + c +"]";
            if (p.A == A && p.B == B && p.G == G && p.R == R) //if same color as main color
            {
                return curpix + addLikePixels(r + 1, c, A, R, G, B, bmp) + addLikePixels(r, c + 1, A, R, G, B, bmp) + addLikePixels(r - 1, c, A, R, G, B, bmp) + addLikePixels(r, c - 1, A, R, G, B, bmp);
            }
            else //if different color
                return "";
        }

【问题讨论】:

  • 转换为迭代解决方案可能比使用庞大的堆栈更好
  • 您可能还想看看Eric Lippertanswer,他很好地解释了您的所有选择。
  • 关于转换为迭代解决方案的任何想法?似乎无法立即想到该解决方案的迭代模拟,除非采用完全不同的方法(我没有提出任何 ATM)。
  • 想出了一个使用堆栈和while循环的解决方案。而(!locations.empty)locations.pop。如果相同的颜色-> 位置。推(上、下、左、右)等;仍然很优雅,但递归确实具有“直观”的美感。

标签: c# recursion stack-overflow


【解决方案1】:

如果您不介意创建一个线程并在另一个线程上执行此操作(不是您需要异步完成,只需将该代码放在另一个线程中,启动它并立即加入),那么您可以创建一个线程一个构造函数来指定堆栈大小并在那里运行您的代码。

【讨论】:

  • 尝试增加线程大小,但是,当我使用大量堆栈大小时,它似乎只减少了 4 倍线程堆栈大小。 (它将转到递归级别 1700,而不是 7200)
【解决方案2】:

创建一个包含所有参数(r,c,A...)的参数对象类。现在,无需直接调用 addLikePixels,只需创建一个新的 param 对象并将其放在堆栈中,该堆栈要么是成员,要么也作为参数传递给 addLikePixels。在 addLikePixels() 中,您总是从堆栈中取出下一个 obj,直到它为空。

您还可以选择使用堆栈(深度优先)或队列(广度优先)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2017-10-15
    • 2020-08-28
    • 2012-04-18
    • 2020-11-17
    • 2019-07-02
    • 2011-01-05
    相关资源
    最近更新 更多