guardar crear array archivo .net memorystream

crear - .NET MemoryStream-¿Debo configurar la capacidad?



memorystream to stream c# (7)

Esta es probablemente una pregunta muy simple, creo que todo lo que busco es la mejor práctica para declarar un nuevo MemoryStream

¿Cuál es la diferencia entre las siguientes 2 muestras:

MemoryStream myStream = new MemoryStream(0x10000);

o

MemoryStream myStream = new MemoryStream();

Obviamente, sé que el primer ejemplo establece la capacidad inicial del flujo. Pero, ambos tienen una capacidad de tamaño variable automáticamente.

¿Hay alguna razón por la que debería usar un método en lugar de otro?


Cuando una secuencia de memoria se redimensiona, crea un nuevo byte [] búfer de nuevo tamaño. Si esta operación se realiza con frecuencia, puede enfrentar uno de dos problemas según el tamaño del búfer: 1. El sistema lanza OurOfMemoryException 2. Toda la memoria del montón se fragmenta. Da consecuencias impredecibles. Por ejemplo, el constructor de System.Drawing.Bitmap falla con el mensaje ''El parámetro no es válido''.


En el primer caso, evita el costo automático de cambio de tamaño de la estructura, mientras que el tamaño necesario es menor que el valor pasado al constructor.


Hay una sobrecarga asociada con el cambio de tamaño de un flujo de memoria. Si sabe o tiene una suposición razonable sobre el tamaño esperado que debe almacenarse en la secuencia de memoria, querrá usar ese tamaño como la capacidad inicial. De lo contrario, se utiliza el tamaño predeterminado de 0 y se redimensionará a medida que se agreguen los datos.


Si sabe el tamaño que va a necesitar, creo que establecer el tamaño explícitamente mejorará el rendimiento, ya que el marco no tendrá que cambiar el tamaño de la secuencia varias veces.


Si sabe que necesitará 0x10000 bytes de datos, el primer fragmento de código garantiza que la secuencia de memoria se inicialice a este tamaño y que nunca más tendrá que aumentar. Puede haber algunas implicaciones de rendimiento dependiendo de cómo la clase administra el búfer por debajo y si necesita un bloque de memoria contiguo; Dependiendo de los detalles, el cambio de tamaño puede ser una operación costosa.


Si ya sabe exactamente cuántos bytes desea almacenar, configurarlo explícitamente en el constructor parece lo correcto. En general, lo mantendría lo más simple posible y solo usaría el constructor predeterminado sin parámetros, es solo una cosa más que tiene Leer y entender al mantener el código de lo contrario.


Vieja pregunta que sé, pero sólo para el registro;

Si está tratando con una gran cantidad de datos (más de un GB en mi caso), la configuración de la capacidad inicial fue la única forma de hacerlo funcionar en un período de tiempo aceptable y sin matar al servidor. En este escenario, la sobrecarga de cambio de tamaño fue crucial.