如何禁用 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
。
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
。