Pregunta

Estoy usando serialización para la función de "salvar" en mi solicitud. Sin embargo, cuando los datos son demasiado grandes (más de 15 MB) me estoy empezando a tener excepciones OutOfMemory.

Tengo tantos objetos y se conectan con otros objetos pequeños, creo que esto está causando demasiada potencia de procesamiento y los datos almacenados en la memoria.

Mi código se basa en esto, casi lo mismo:

http://www.codeproject.com/KB/vb/TreeViewDataAccess.aspx

Editar

  1. No consumo serialización personalizada, se hace todo por [serialización] atributos. Excluyendo algunos campos.

  2. Me serializar tantos objetos y clases personalizadas. Incluye diccionario, estructuras y montón de otras cosas.

  3. Me serializarlo en un archivo.

  4. Yo uso XmlSerializer

P.S. Tengo memoria física de 4 GB.

Solución

Gracias a las respuestas, mi problema fue encontrado para estar con XmlSerializer y tengo que deshacerse de él. serialización binaria está trabajando muy bien con los datos que tengo.

¿Fue útil?

Solución

15 MB no debe darle una OOM.

Si los datos son igual de árboles (en lugar de un gráfico completo), usted podría considerar un serializador como protobuf-net; así como el uso muy eficiente "búferes de protocolo" binarios (tanto la velocidad y la memoria) de Google formato, se beneficia de no tener que hacer referencia de seguimiento (necesario para gráficos) - lo que significa que sólo tiene que preocuparse de los datos una vez (dos veces si tiene para conseguir tamponada).

Sin embargo, esto requiere diferentes marcadores para sus clases (o, al menos, un "opt in") - y no va a manejar gráficos completos. Pero está ahí, y libre ...

Otros consejos

Yo tenía exactamente el mismo problema. La razón es que .NET serialización no escala.

He resuelto el problema mediante el uso de una excelente abierta de Simon Hewitt biblioteca de código, ver Optimización de serialización en .NET - parte 2 .

Además de reducir drásticamente el uso de memoria es también mucho Más rápido. Al igual que en el artículo que tengo una velocidad de seguimiento de 20 veces.

En realidad, ignora el XmlSerializer SerializableAttribute atributos. Se utilizan sólo por las clases de formato (BinaryFormatter, SoapFormatter).

No me serializar utilizando el XmlSerializer, y especialmente no una combinación de XmlSerializer y BinaryFormatter.

Me limitaré a tratar de serializar todo utilizando BinaryFormatter.

Se puede escribir sus propias rutinas de serialización y ver si se puede obtener ningún beneficio de rendimiento con la mano-adaptación de su proceso de serialización. Para más detalles, consulte la página de MSDN en la serialización personalizado .

Tal vez usted puede darnos un poco más de detalle acerca de cómo se hace la serialización. Cómo se utiliza un serialización personalizada? ¿O simplemente utiliza el [serialización] atributo incorporada?

Creo que una buena manera para que usted resuelva esto es tratar de hacer su lógica de serialización personalizado y sólo serializar sólo lo que necesita, no puede ir a 4 GB, de todos modos, también depende de la cantidad de memeory su aplicación tiene asignado.

Con todos los enfoques que se mencionan aquí, la facilidad de dumping objetos grandes en el disco y la recuperación se pierde. También estos soporte únicamente volcado tipos de datos, lo que no puede deshacerse de los tipos de referencia tan fácilmente como lo haría con BinaryFormatter.

También haciendo compresión utilizando gzip o 7-Zip antes de formatear binaria de objetos de gran tamaño en realidad mover el tamaño de más de 16 MB a algo como 32 MB.

Se puede descargar JSON.NET biblioteca que funciona en mi proyecto más de serialización y deserialización 100 MB de datos.

Para serialización se puede trabajar como

Si usted tiene el uso de objetos TextWriter

using (TextWriter textWriter = File.CreateText("LocalJsonFile.json"))
{
    var serializer = new JsonSerializer();
    serializer.Serialize(textWriter , yourObject);
}

Si usted tiene el uso de cadena StringWriter

  StringBuilder sb = new StringBuilder();
  StringWriter sw = new StringWriter(sb);

  using(JsonWriter textWriter = new JsonTextWriter(sw))
  {
     var serializer = new JsonSerializer();
     serializer.Serialize(textWriter, yourObject);
  }

Esto puede funcionar para usted.

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