La situación es que estoy realizando una llamada WCF a un servidor remoto que devuelve un documento XML como una cadena.Cómo maximizar el bloque contiguo más grande de memoria en el montón de objetos grandes
mayoría de las veces este valor de retorno es de unos pocos K, a veces unas pocas docenas K, muy de vez en cuando unos pocos cientos de K, pero muy rara vez podría ser de varios megabytes (primer problema es que no hay manera de que yo sé)
Son estas raras ocasiones las que están causando dolor. Consigo un seguimiento de pila que comienza:
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)
he leído alrededor y es porque el objeto grande Montón apenas está demasiado fragmentado, por lo que incluso anterior a la llamada con una comprobación rápida para StringBuilder.EnsureCapacity simplemente hace que el OutOfMemoryException se lanzará antes (y debido a que estoy adivinando lo que se necesita, puede que en realidad no necesite tanto que mi chequeo está causando más problemas de los que está resolviendo). Algunos opinions dicen que no hay mucho que pueda hacer al respecto.
Algunas de las preguntas que me he preguntado a mí mismo:
- utilizan menos memoria - ¿Ha comprobado que no haya fugas? Sí. El uso de memoria aumenta y disminuye, pero no hay un crecimiento fundamental que garantice que esto suceda. Algunas veces falla, tuvo éxito en esa etapa previamente.
- Transferencia de cantidades más pequeñas No es una opción, este es un servicio de terceros web a través de los cuales no tengo control (o al menos se necesitaría mucho tiempo para resolver, mientras tanto todavía tengo un problema)
- ¿Puedes hacerle algo al LOH para que sea menos probable que falle? ... ahora este es el curso más fructífero. Es un proceso de 32 bits (tiene que ser por varias razones políticas, técnicas y aburridas) pero normalmente hay cientos de meg free (múltiplos de la cantidad más grande por la que hemos visto fallas).
- ¿Podemos monitorear el LOH? Utilizando perfmon puedo rastrear el tamaño de los montones, pero no creo que haya una manera de controlar el bloque contiguo de memoria más grande disponible.
Pregunta es: ¿algún consejo o sugerencia para probar?
Cambiar el encuadernado es una buena idea. Lo probaré. Un reciclado continuo fue nuestro último recurso ... – Unsliced
hemos tenido la suerte de mitigar cualquier problema con el gran procesamiento de documentos a través de mejoras de código (aunque poseemos ambos puntos finales) o cambios vinculantes, al menos para ayudarnos a un reciclaje de mantenimiento programado regularmente (debido a parches, lanzamiento de características, etc.). @ La idea de Steven de usar windbg para el análisis de pila también puede generar beneficios. Pruebe http://blogs.msdn.com/tess/ y encontrará buena información de Tess Ferrandez sobre cómo comenzar aquí. Excelentes laboratorios! ¡Buena suerte! –