【问题标题】:Memory usage constraints on thread count using PLINQ使用 PLINQ 对线程计数的内存使用限制
【发布时间】:2013-04-25 22:14:52
【问题描述】:

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

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

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

【问题讨论】:

  • 据我所知,PLINQ 预先决定线程数,并且在执行问题时保持不变。您对此无能为力(除了通过调用WithDegreeOfParallelism() 更改该常量)。如果您改用Parallel.ForEach(),您可能会有更好的机会:使用自定义TaskScheduler

标签: c# .net plinq


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多