我正在使用 PLINQ 对操作进行数据并行化。每个线程消耗大量内存,内 stub 据算法设置而变化,没有简单的方法可以根据算法选项预先计算需要多少内存。当内存需求较低时,最佳线程数是系统总数 8 中的 7 个;当内存要求很高时,2 个线程比 1 个线程有显着改进,但一旦使用 3 个线程,系统就会开始访问页面文件,CPU 利用率下降到 0,性能会下降数百倍。
我想做的是让 PLINQ 逐渐增加线程数,同时监视内存负载,一旦系统耗尽可用物理内存,就在最后一个线程上设置取消标记,以便它可以回滚它的内存,允许其他线程以最佳方式执行。
关于如何从 PLINQ 中消除这种行为的任何想法,或者我是否必须完全自己动手?
最佳答案
PLINQ 使用 TreadPool
线程(默认使用 TaskScheduler
和 TaskFactory
),因此您可以使用 ThreadPool.SetMaxThreads(#N, # Q)
根据应用的当前内存消耗控制线程数。
但在我看来,如此巨大的内存消耗是一个应用程序,也许应该重新设计并推送到另一个模块(如数据库 - 精简 RDBMS 或 NoSQL 数据库 - 或缓存系统) - 只是一个建议。
关于c# - 使用 PLINQ 对线程数的内存使用限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16225656/