Ситуация заключается в том, что я делаю вызов WCF на удаленный сервер, который возвращает XML-документ в виде строки.Как увеличить максимальный непрерывный блок памяти в кучке большого объекта
В большинстве случаев это возвращаемое значение составляет несколько K, иногда несколько десятков K, иногда несколько сотен K, но очень редко это может быть несколько мегабайт (первая проблема заключается в том, что мне неизвестно).
Это такие редкие случаи, которые вызывают горе. Я получаю трассировку стека, который начинается:
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Xml.BufferBuilder.AddBuffer()
at System.Xml.BufferBuilder.AppendHelper(Char* pSource, Int32 count)
at System.Xml.BufferBuilder.Append(Char[] value, Int32 start, Int32 count)
at System.Xml.XmlTextReaderImpl.ParseText()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.ReadElementString()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMDRQuery.Read2_getMarketDataResponse()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer2.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
Я читал вокруг, и это происходит потому, что большой объект кучного только становится слишком фрагментированным, поэтому даже предшествующий вызов с быстрой проверки на StringBuilder.EnsureCapacity только приводит к тому, OutOfMemoryException, которое будет выбрано ранее (и потому, что я догадываюсь о том, что нужно, на самом деле это может не понадобиться, поэтому мой чек вызывает больше проблем, чем он решает). Некоторые opinions - это то, что я не могу с этим поделать.
Некоторые из вопросов, который я задал себе вопрос:
- Использование меньше памяти - вы проверили на герметичность? Да. Использование памяти идет вверх и вниз, но нет фундаментального роста, который гарантирует, что это произойдет. Некоторое время, когда он терпит неудачу, ему это удалось на этом этапе.
- передачи меньшего количества Не вариант, это третья сторона веб-службы, по которой я не имею никакого контроля (или, по крайней мере, это заняло бы много времени, чтобы решить, в то же время я до сих пор есть проблемы)
- Можете ли вы что-то сделать для LOH, чтобы сделать его менее вероятным? ... сейчас это самый плодотворный курс. Это 32-битный процесс (это должно быть по различным политическим, техническим и скучным причинам), но, как правило, сотни мегабайт (кратные наибольшей сумме, за которые мы видели сбои).
- Можем ли мы контролировать LOH? Использование perfmon Я могу отслеживать размер кучи, но я не думаю, что есть способ контролировать самый большой доступный непрерывный блок памяти.
Вопрос: любые советы или предложения по поводу вещей, чтобы попробовать?
Изменение привязки - хорошая идея - я попробую. Революционный прокат был нашим последним курортом ... – Unsliced
Нам посчастливилось смягчить любые проблемы с большой обработкой документов с помощью либо улучшения кода (у нас есть оба конечных пункта), либо изменения привязки, по крайней мере, чтобы пройти нас к регулярному обновлению технического обслуживания (из-за исправления, выпуска функций и т. д.). @ Идея Стивена использовать windbg для анализа кучи также может принести пользу. Попробуйте http://blogs.msdn.com/tess/, и вы найдете хорошую информацию от Тесс Феррандес о том, как начать работу здесь. Отличные лаборатории! Удачи! –