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內存
有什麼我需要爲了優化這個查詢,這樣做不會導致內存不足問題?
感謝您的回覆。我按照你的建議改變了我的查詢,但是我仍然得到一個OutOfMemoryException。它在初始化其中一個實體的List屬性時發生。我有一個名爲StatefulEntityObject的EntityObject的子類,其中我設置了一些用於在業務事務中管理實體狀態的屬性。我知道在ObjectContext中有狀態管理功能,但是這有一些自定義的東西,我用它們來設置實體所連接的網格中的行的視圖狀態。 –
lintmouse
2012-04-16 14:13:48
我認爲有這個小類是什麼造成我的困境。當我不使用自己的繁重子類時,我會記住你對未來PLINQ實現的建議。 – lintmouse 2012-04-16 14:15:22