【问题标题】:How to disable PLINQ partitioning/batching如何禁用 PLINQ 分区/批处理
【发布时间】:2016-09-22 13:24:26
【问题描述】:

PLINQ 在内部对需要的项目进行批处理以减少开销。由于我的项目非常占用内存,我想尽量减少 PLINQ 查询管道中存在的任何缓冲。如何完全禁用分区/批处理?

代码如下所示:

var myItems = Enumerable.Range(0, 10000000).Select(_ => new byte[1 << 30]);
var results =
 myItems
 .AsParallel()
 .WithMaxDegreeOfParallelism(4)
 .Select(F)
 .ToList();

在这段代码中,我预计不符合垃圾回收条件的(大)项目的最大数量为 4。

【问题讨论】:

  • 您能否更详细地解释一下您在做什么,最好包括一些代码? PLINQ 中有不同类型的批处理,它们有不同的禁用方式。
  • @svick 对,我应该马上提供代码。希望这会有所帮助。

标签: .net plinq


【解决方案1】:

您要做的是在您的源上使用create a Paritioner,它指定NoBuffering,然后在您的PLINQ查询中使用它:

var myItems = Enumerable.Range(0, 1000).Select(_ => new byte[1 << 30]);
var myPartitioner = Partitioner.Create(myItems, EnumerablePartitionerOptions.NoBuffering);
var results =
    myPartitioner
    .AsParallel()
    .WithDegreeOfParallelism(4)
    .Select(F)
    .ToList();

此查询对我有用,但如果我跳过分区程序,则会抛出 OutOfMemoryException(就像您的原始查询一样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多