Управляемый API веб-служб Exchange - использование ItemView.Offset для FindItems () снижает производительность метода LoadPropertiesForItems - PullRequest
1 голос
/ 11 апреля 2011

Я провожу небольшое исследование возможного применения EWS в нашем существующем проекте, написанном с интенсивным использованием MAPI, и обнаружил что-то тревожное в производительности метода LoadPropertiesForItems ().

Рассмотрим такой сценарий:

  • у нас есть 10000 (десять тысяч) сообщений в папке «Входящие»
  • мы хотим получить приблизительно 30 свойств каждого сообщения, чтобы увидеть, удовлетворяют ли они нашим условиям для дальнейшей обработки
  • сообщений извлекаются с сервера в упаковках по 100 сообщений

Итак, код выглядит так:

        ItemView itemsView = new ItemView(100);

        PropertySet properties = new PropertySet();
        properties.Add(EmailMessageSchema.From);
        /*
        add all necessary properties...
        */
        properties.Add(EmailMessageSchema.Sensitivity);

        FindItemsResults<Item> findResults;
        List<EmailMessage> list = new List<EmailMessage>();

        do
        {
            findResults = folder.FindItems(itemsView);                
            _service.LoadPropertiesForItems(findResults, properties);

            foreach (Item it in findResults)
            {
                ... do something with every items
            }

            if (findResults.NextPageOffset.HasValue)
            {
                itemsView.Offset = findResults.NextPageOffset.Value;
            }

        }while(findResults.MoreAvailable);

И проблема в том, что каждое приращение свойства itemsView.Offset делает метод LoadPropertiesForItems более длинным для выполнения. Для первой пары итераций это не очень заметно, но примерно 30-й цикл времени увеличивает время вызова с 1 до 8 и более секунд. А выделение памяти выходит за физические пределы, вызывая исключение нехватки памяти.

Я почти уверен, что мои проблемы "связаны со смещением", потому что я немного изменил код:

        itemsView = new ItemView(100, offset, OffsetBasePoint.Beginning);
        ...rest of loop
        if (findResults.NextPageOffset.HasValue)
        {
            offset = findResults.NextPageOffset.Value;
        }

и я манипулировал переменной смещения (объявленной вне цикла) таким образом, что я установил ее значение на 4500 при запуске, а затем в режиме отладки после первой итерации я изменил ее значение на 100. И согласно моим подозрениям первый вызов LoadPropertiesForItems потребовалось много времени для выполнения, и второй вызов (со смещением = 100) был очень быстрым.

Может кто-нибудь подтвердить это и, возможно, предложить какое-то решение для этого?

Конечно, я могу выполнять свою работу без использования смещения, но почему я должен? :)

1 Ответ

2 голосов
/ 27 апреля 2011

Изменение смещения является дорогостоящим, потому что сервер должен перебирать элементы с самого начала - невозможно иметь порядковый индекс для сообщений, потому что новые сообщения могут быть вставлены в представление в любом порядке (подумайте о просмотр имени или темы).

Лучший подход - это пролистать все элементы один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...