Pregunta

Hola chicos, aquí está el problema,

Básicamente, tengo una lista muy grande que contiene diccionarios relativamente grandes

Entonces, básicamente, tengo una gran colección de memoria.

Luego serializo esta colección manualmente en XML y la envío a través de http. No hace falta decir que el XML es demasiado grande, a veces tan grande que obtengo una excepción OutOfMemory antes de intentar enviarlo.

En .NET, ¿cómo haría para calcular el uso potencial de la memoria? Por ejemplo, en este caso, tengo que descomponer el XML en fragmentos, procesando solo pequeñas cantidades de la Colección en un tiempo.

¿Cómo calculo eficientemente el tamaño de cada " fragmento " sobre la marcha. No quiero elegir un número arbitrario como "procesar 100 elementos en cualquier momento", quiero saber, aproximadamente, qué tan grande debe ser cada porción caso por caso.

aplausos

UPDATE

Aunque @Jacob proporcionó la mejor solución para este problema en particular, la estructura conceptual de la aplicación es defectuosa.

De hecho, la solución es ejecutar una fracción de su mensaje, para calcular qué tan grande será el mensaje cuando trabaje con una colección.

Luego envía cada unidad de tamaño aceptable, una por una.

Pero esto es solo un truco. La solución real es encontrar una manera de no pasar mensajes grandes o utilizar un protocolo completamente diferente.

Hay una publicación interesante sobre el tema aquí si quieres usar SOAP, sin embargo, decidí encontrar una forma de evitar el envío de tantos datos.

¿Fue útil?

Solución

Creo que podrías tener un problema conceptual más que cualquier otra cosa. " Calcular el uso potencial de memoria " está en desacuerdo con "calcular eficientemente el tamaño de cada fragmento". La única forma de realmente obtener el uso de su memoria con el grado de precisión en el que puede predecir el tamaño adecuado del fragmento es realmente realizar su conversión.

Parece que la mejor manera de llegar a esto de manera eficiente podría ser abordarlo progresivamente, esencialmente lo que dicen los que sugieren objetos de transmisión. Si no puede aprovechar la transmisión real, probablemente querrá estructurar su serialización para que progrese una unidad conceptual a la vez (es decir, un elemento en su lista con sus hijos de diccionario auxiliares).

Otros consejos

¿Por qué no simplemente transmite los datos para convertirlos a XML sobre la marcha y evitar tener un gran archivo XML en la memoria?

¿Cómo lo envías? Debe hacerlo a través de WCF, que puede hacer streaming. También le daría la opción, a través de la configuración, de usar XML o binario, o lo que sea.

Si es un problema enviar, ¿no es también un problema recibir? Parece que estás tratando de resolver la mitad de un problema. XML es un gran no-no para grandes datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top