OutOfMemoryException в службе данных WCF - PullRequest
0 голосов
/ 21 февраля 2011

Я пытаюсь раскрыть некоторые сущности с помощью службы данных WCF. Мои таблицы содержат огромное количество данных, и запросы могут легко вернуть 50 000 записей. У меня есть надстройка Excel, которая подключается к этой службе и помогает пользователям импортировать данные из службы в свои таблицы Excel.

Мой код клиента выглядит примерно так:

UTF8Encoding utf8Encoding = new UTF8Encoding();
Entities plDataEntities = new Entities(new Uri(@"http://localhost/AdoNetDataService.svc/"));

int recordCount = 0;
var apples = (from a mada in plDataEntities.Apples select a).Take(50 * 1000);
using (var fileStream = new FileStream(@"C:\Apples.txt", FileMode.Create))
{
   foreach (Apple apple in apples)
   {
      var description = getAppleDescription(apples);

      byte[] bytes = utf8Encoding.GetBytes(description);

      fileStream.Write(bytes, 0, bytes.Length);
      fileStream.Flush();
      recordCount++;
   }
}

Я думал, что сервис будет обслуживать эти данные, поскольку он читает их из БД, но похоже, что происходит некоторая буферизация, и я получаю исключение памяти.

У меня нет какой-либо конкретной конфигурации для управления памятью, и я не смог найти ничего полезного об оптимизации памяти в службах данных ado.net. Мы будем благодарны за любую помощь в оптимизации памяти. Также я открыт для предложения пойти другим путем, поэтому не стесняйтесь вносить предложения.

1 Ответ

0 голосов
/ 22 февраля 2011

Вы можете выполнить пейджинг на стороне клиента или на стороне сервера, чтобы обойти эту проблему:

1> Вы можете выполнять пейджинг на стороне клиента - вместо Take (50 * 1000) вы можете изменить его на Take (1000) или что-то в этом роде и писать цикл до тех пор, пока все объекты не будут загружены. Таким образом, вы получаете меньшие куски, но с другой стороны вы делаете больше обращений к серверу.

2> Вы можете выполнять пейджинг на стороне сервера - в этом случае сервер предоставит вам набор сущностей и следующую ссылку uri для выборки следующего набора сущностей. Продолжайте запрашивать, пока не будет указана следующая ссылка, и в этот момент вы загрузили все объекты в клиенте.

Надеюсь, это поможет. Спасибо Pratik

...