4

我正在使用 PLINQ 对操作进行数据并行化。每个线程都会消耗大量内存,这些内存会根据算法设置而变化,没有简单的方法可以根据算法选项预先计算需要多少内存。当内存要求较低时,最佳线程数是系统总数 8 中的 7 个;当内存要求很高时,2 个线程比 1 个有显着的改进,但是一旦使用 3 个线程,系统就会开始访问页面文件,CPU 利用率下降到 0,性能会变差数百倍。

我想做的是让 PLINQ 逐渐增加线程数,同时监控内存负载,一旦系统耗尽可用物理内存,在最后一个线程上设置取消令牌,以便它可以回滚其内存,允许其他线程以最佳方式执行。

关于如何从 PLINQ 中获得这种行为的任何想法,还是我必须完全自己动手?

4

1 回答 1

1

PLINQ 使用TreadPool线程(使用默认值TaskSchedulerTaskFactory),因此您可以ThreadPool.SetMaxThreads(#N, #Q)根据应用程序的当前内存消耗来控制线程数。

但在我看来,这么大的内存消耗是一个应用程序,也许应该重新设计并推送到另一个模块(如数据库 - 一个精简的 RDBMS 或 NoSQL 一个 - 或缓存系统) - 只是一个建议。

于 2013-05-08T23:36:37.227 回答