2016-09-22 65 views
0

PLINQ在内部批量处理所需的项目以减少开销。由于我的项目内存密集,我想尽量减少存在于PLINQ查询管道中的任何缓冲。我怎样才能完全禁用分区/批处理?如何禁用PLINQ分区/批处理

的代码看起来是这样的:

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

在这段代码中,我期望的不符合条件的垃圾收集(大)项的最大数目为4。

+0

你能否更详细地解释你在做什么,最好包括一些代码?在PLINQ中有不同种类的配料,他们有不同的方法来禁用它们。 – svick

+0

@svick对,我应该马上提供代码。希望这可以帮助。 – boot4life

回答

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如果我跳过分区器(就像您的原始查询)。