在并行 for 循环 C# 中定义堆栈大小

Posted

技术标签:

【中文标题】在并行 for 循环 C# 中定义堆栈大小【英文标题】:Define stack size in a parallel for loop C# 【发布时间】:2015-10-23 08:02:22 【问题描述】:

我正在实现一个随机森林算法。每棵树都以递归方式进行训练(随着树的深入而增加调用堆栈的大小),我可以毫无问题地训练一棵树(或顺序循环中的几棵树)。

但是,在 Parallel.For 循环中训练所有树会导致堆栈溢出。我知道在使用 new Thread() 时可以配置堆栈大小,如:How to change stack size for a .NET program?

但是,是否可以使用 Parallel.For 来做到这一点?还是我必须编写所有线程,指定它们的堆栈大小?

【问题讨论】:

考虑使用Stack<T> 并将方法重写为迭代。 @Bas,你能说得具体一点(或发个链接)吗? ***.com/questions/531668/… 【参考方案1】:

来自social.msdn:

默认情况下,TPL 使用 CLR 线程池中的线程。堆栈大小 对于 ThreadPool 线程是进程的默认堆栈大小,即 由包含进程入口点的可执行文件确定。

您可以通过编辑这个来更改进程的默认堆栈大小 在可执行文件中设置。一种方法是使用“editbin.exe” 随 Visual Studio 一起提供。如果您的可执行文件是 "myprogram.exe" 并且你想要一个 2MB 的堆栈,你可以运行:

editbin /stack:2097152 myprogram.exe

希望有帮助!

【讨论】:

以上是关于在并行 for 循环 C# 中定义堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中增加堆栈大小? 1MB 是不够的。我有 32GB 的可用 RAM [重复]

C# - 在for循环中使用相同的列表大小,索引超出了数组的范围[重复]

C++ OpenMP 并行 For 循环 - std::vector 的替代品 [关闭]

C#中,定义了一个枚举,怎么用for循环来遍历枚举中的每个值?

有没有办法增加c#中的堆栈大小?

C#之任务,线程和同步