我正在尝试更新标准LINQ查询以使用PLINQ。标准查询如下所示:
var query = (from doc in this.ownershipRepository.GetDocuments()
let queryStateCode = this.currentQuery.StateCode
let queryCountyCode = this.currentQuery.CountyCode
where queryStateCode != null ? doc.StateCode == queryStateCode : true &&
queryCountyCode != null ? doc.CountyCode == queryCountyCode : true
orderby doc.Owner
select doc)
.Take(QUERY_RESULTS_SIZE);
存储库中的.GetDocuments()方法就是这样:
public class OwnershipRepository : IDisposable
{
private OwnershipEntities context;
...
public IQueryable<Document> GetDocuments()
{
return this.context.Documents;
}
...
}
这很好用。我试图利用PLINQ的查询,如下所示:
var query = (from doc in this.ownershipRepository.GetDocuments().AsParallel()
let queryStateCode = this.currentQuery.StateCode
let queryCountyCode = this.currentQuery.CountyCode
where queryStateCode != null ? doc.StateCode == queryStateCode : true &&
queryCountyCode != null ? doc.CountyCode == queryCountyCode : true
orderby doc.Owner
select doc)
.AsSequential()
.Take(QUERY_RESULTS_SIZE);
但是这会引发System.OutOfMemoryException。我在具有以下规格的机器上进行测试:
Intel(R)Core(TM)i7 CPU 860 @ 2.80GHz 2.79 GHz / 4 GB内存
我是否需要做一些事情来优化此查询,以免导致内存不足问题?
答案 0 :(得分:1)
使查询并行意味着在某个阶段将其拆分,然后再将其合并。 你在开始时分裂。这似乎是正确的。比过滤和排序分裂序列。这些需要保存在mem中并合并回来。我的建议是在合并后进行排序。
var query = (from doc in this.ownershipRepository.GetDocuments().AsParallel()
let queryStateCode = this.currentQuery.StateCode
let queryCountyCode = this.currentQuery.CountyCode
where queryStateCode != null ? doc.StateCode == queryStateCode : true &&
queryCountyCode != null ? doc.CountyCode == queryCountyCode : true
select doc);
var result = query.AsSequential().OrderBy(doc=>doc.Owner).Take(QUERY_RESULTS_SIZE);