2016-09-22 81 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如果我跳過分區器(就像您的原始查詢)。