如何禁用PLINQ分区/批处理

时间:2016-09-22 13:24:26

标签: .net plinq

PLINQ在内部批量处理所需的项目以减少开销。由于我的项目非常耗费内存,因此我希望尽量减少PLINQ查询管道中存在的任何缓冲。如何完全禁用分区/批处理?

代码如下所示:

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

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

1 个答案:

答案 0 :(得分:1)

您要做的是create a Paritioner对您的来源NoBuffering,指定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(); ,然后在您的PLINQ查询中使用它:

OutOfMemoryException

此查询适用于我,但如果我跳过分区程序(就像您的原始查询一样),则会抛出List<DateTime> datesToShow = new List<DateTime>(); datesToShow.Add(new DateTime(2016, 9, 22)); datesToShow.Add(new DateTime(2016, 9, 21)); var todays_totals = dbContext.daily_totals.Where(o=> datesToShows.Contains(o.date_reference)).ToList(); //Result should be a list that contains records that match those 2 dates.