在并行 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 的替代品 [关闭]