【发布时间】:2013-04-25 22:14:52
【问题描述】:
我正在使用 PLINQ 对操作进行数据并行化。每个线程都会消耗大量内存,这会根据算法设置而变化,没有简单的方法可以根据算法选项预先计算需要多少内存。当内存要求较低时,最佳线程数是系统总数 8 个中的 7 个;当内存要求很高时,2 个线程比 1 个有显着的改进,但是一旦使用 3 个线程,系统就会开始访问页面文件,CPU 利用率下降到 0,性能会下降数百倍。
我想做的是让 PLINQ 逐步增加线程数,同时监控内存负载,一旦系统耗尽可用物理内存,在最后一个线程上设置取消令牌,以便它可以回滚它的内存,允许其他线程以最佳方式执行。
关于如何从 PLINQ 中消除这种行为的任何想法,还是我必须完全自己动手?
【问题讨论】:
-
据我所知,PLINQ 预先决定线程数,并且在执行问题时保持不变。您对此无能为力(除了通过调用
WithDegreeOfParallelism()更改该常量)。如果您改用Parallel.ForEach(),您可能会有更好的机会:使用自定义TaskScheduler。