【发布时间】:2015-04-09 14:26:44
【问题描述】:
我有一个这样的 PLINQ 查询...
batch
.AsParallel()
.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
.WithCancellation(cancellationToken);
.Select(i => new { instruction = i, accountKey = new AccountKey(i.x, i.y, i.z) })
.GroupBy(x => x.accountKey)
.ForAll(grouping =>
{
foreach (var instructionBatch in grouping.OrderBy(i => i.instruction.FileRow).Select(i => i.instruction))
{
// High CPU method.
}
});
在一个批次中,可以有 10,000 条记录。这些调用高 CPU 方法,该方法反过来调用 Web 服务并将信息保存到数据库。
在我的物理 64 位 pc i7-4770 CPU @ 3.40 GHz 16.0GB 内存上。运行此代码的服务会启动大约 32 个线程并占用大约 150,000 - 200,000 KB 的内存使用量。
在 64 位虚拟机 E5-2630 v3 @2.40GHz 的 Hyper-V 测试环境中,它生成超过 200 个线程,内存接近 2gb 限制。
有什么原因导致它启动了这么多线程以及为什么没有在虚拟机上释放内存?
我是否需要使用 WithDegreeOfParallelism。如果这个过程可能会同时调用 4 个不同的批次(例如 1 x 1 记录、1 x 100 记录、1 x 1000 和 1 x 10,000),这是否意味着当我指定 WithDegreeOfParallelism 时,这 4 个批次将分别触发线程数,甚至是 1 条记录的批次?
感谢您的帮助。
【问题讨论】:
标签: multithreading parallel-processing virtual-machine hyper-v plinq