System.OutOfMemoryException в веб-службе WCF - PullRequest
2 голосов
/ 22 октября 2009

Я борюсь за исключение System.OutOfMemoryException при выполнении процесса импорта, когда создается много объектов.

В результате ASPNET_WP.EXE увеличивает объем до 1,4 ГБ, и будет выдано исключение.

Я уже пытался реализовать IDisposable и вызывать сборщик мусора (GC.Collect ()) в этих ответственных функциях, но безрезультатно.

Сервер представляет собой QuadCore (C2Q) с 4 ГБ ОЗУ. Даже если ОЗУ больше, чем 1,4 ГБ, исключение всегда выдается, когда файл aspnet_wp.exe достигает 1,4 ГБ.

Что я могу сделать, чтобы избежать этих проблем с OutOfMemory?

Точное сообщение об исключении:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at
OpenAccessRuntime.DataObjects.PersistenceManagerFactoryBase.
CreatePersistenceMangerImp(StorageManger sm)
at
....

Ответы [ 3 ]

2 голосов
/ 22 октября 2009

Одно слово: Самостоятельный хостинг .

IIS имеет ограничения и проблемы, когда дело доходит до обработки памяти, и если ваша служба WCF действительно должна использовать более 1,4 ГБ памяти на сервере, то вам необходимо разместить эту службу WCF самостоятельно, в консольном приложении, NT Service, приложение Winforms - какой бы путь вы ни выбрали.

Быстрый вопрос: как ваш сервер будет обрабатывать 10 одновременных запросов, если при обработке каждого запроса будет использовано 1,4 ГБ памяти ...

Вы пытаетесь вернуть файлы или что-то еще? В этом случае вам следует проверить потоковую передачу WCF , которая позволяет существенно уменьшить размер буферной памяти, необходимой на сервере.

Марк

1 голос
/ 22 октября 2009

Можете ли вы выполнять импорт по частям вместо того, чтобы быстро создавать множество объектов и избавляться от них.

Возможно, вы захотите рассказать больше о том, что происходит, как вы обрабатываете импорт.

Например, можете ли вы полностью обработать и сохранить каждый объект, а затем сделать другой объект?

Возможно, вы захотите получить профилировщик памяти. Вот некоторые профилировщики c # с открытым исходным кодом: http://csharp -source.net / с открытым исходным кодом / профайлеры

Я бы посмотрел на две вещи.

  1. Можете ли вы изменить свой Алгоритм, чтобы предотвратить это.
  2. Получить больше информации о том, почему это происходит.
0 голосов
/ 22 октября 2009

Имейте в виду, что вы не получите доступ ко всей памяти, если вы работаете в asp.net, это позволит вам только 2 гигабайта со стандартной конфигурацией. Может быть, вам следует перенести это в службу Windows или консольное приложение.

См. Здесь: «Факт: в стандартной конфигурации ваш рабочий процесс всегда имеет доступную виртуальную память 2 ГБ (независимо от того, есть ли у вас 1, 2 или 4 ГБ физической памяти в машине)."

http://jesperen.wordpress.com/2007/05/23/understanding-aspnet-memory/

...