带有PLINQ的System.OutOfMemoryException

时间:2012-04-12 14:45:06

标签: out-of-memory plinq

我正在尝试更新标准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内存

我是否需要做一些事情来优化此查询,以免导致内存不足问题?

1 个答案:

答案 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);