2012-04-12 51 views
1

我想更新一個標準的LINQ查詢來使用PLINQ。標準查詢看起來是這樣的:System.OutOfMemoryException與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。我有以下規格的機器上測試這個:

英特爾(R)酷睿(TM)i7處理器860 @ 2.80GHz的2.79千兆赫/ 4 GB內存

有什麼我需要爲了優化這個查詢,這樣做不會導致內存不足問題?

回答

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); 
+0

感謝您的回覆。我按照你的建議改變了我的查詢,但是我仍然得到一個OutOfMemoryException。它在初始化其中一個實體的List 屬性時發生。我有一個名爲StatefulEntityObject的EntityObject的子類,其中我設置了一些用於在業務事務中管理實體狀態的屬性。我知道在ObjectContext中有狀態管理功能,但是這有一些自定義的東西,我用它們來設置實體所連接的網格中的行的視圖狀態。 – lintmouse 2012-04-16 14:13:48

+0

我認爲有這個小類是什麼造成我的困境。當我不使用自己的繁重子類時,我會記住你對未來PLINQ實現的建議。 – lintmouse 2012-04-16 14:15:22