2012-04-12 3 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. Я проверяю это на машине со следующими спецификациями:

Intel (R) ядро ​​(TM) i7 CPU 860 @ 2.80GHz 2,79 ГГц/4 ГБ памяти

Есть ли что-то мне нужно чтобы оптимизировать этот запрос, чтобы он не вызывал проблем с памятью?

ответ

1

Выполнение запроса параллельно означает разбить его на какой-то этап, а затем снова объединить его. Вы раскалываетесь в начале. Это кажется правильным. Чем вы фильтруете и сортируете разбитые последовательности. Они должны храниться в памяти и сливаться. Мое предложение - сортировать в конце после слияния.

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 на одном из объектов. У меня есть подкласс EntityObject, называемый StatefulEntityObject, где я устанавливаю некоторые свойства, которые используются для управления состоянием сущностей во время бизнес-транзакции. Я знаю, что в ObjectContext есть функции управления состоянием, но у этого есть некоторые настраиваемые элементы, которые я использую для установки состояния представления строк в сетке, к которым привязаны объекты. – lintmouse

+0

Я думаю, что наличие этого подкласса - это то, что вызывает мои беды. Я буду помнить ваше предложение о будущих реализациях PLINQ, когда я не использую свой собственный обременительный подкласс. – lintmouse