如何禁用 PLINQ partitioning/batching

How to disable PLINQ partitioning/batching

PLINQ 在内部对它所需要的项目进行批处理以减少开销。因为我的项目非常占用内存,所以我想尽量减少 PLINQ 查询管道中存在的任何缓冲。我怎样才能完全禁用 partitioning/batching?

代码如下所示:

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

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

您想要做的是 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