PLINQ在内部批量处理所需的项目以减少开销。由于我的项目非常耗费内存,因此我希望尽量减少PLINQ查询管道中存在的任何缓冲。如何完全禁用分区/批处理?
代码如下所示:
var myItems = Enumerable.Range(0, 10000000).Select(_ => new byte[1 << 30]);
var results =
myItems
.AsParallel()
.WithMaxDegreeOfParallelism(4)
.Select(F)
.ToList();
在此代码中,我预计不符合垃圾回收条件的(大)项目的最大数量为4个。
答案 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.
。