1

PLINQを使用するように標準のLINQクエリを更新しようとしています。標準のクエリは次のようになります。

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 /4GBメモリ

このクエリを最適化してメモリ不足の問題が発生しないようにするために必要なことはありますか?

4

1 に答える 1

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);
于 2012-04-16T07:59:21.133 に答える