Tengo una función que genera y devuelve un MemoryStream. Después de la generación el tamaño de la MemoryStream es fijo, no necesito escribir para ella ya que sólo se requiere la salida. Escribir a MailAttachment o escribir a la base de datos por ejemplo.

¿Cuál es la mejor manera de la mano de un objeto alrededor? MemoryStream o Matriz de Bytes? Si yo uso MemoryStream tengo para restablecer la posición después de leer.

  • ¿Con qué frecuencia usted necesita para volver a leer los datos?
  • Depende. A veces, sólo una vez, a veces 2 o 3 veces.
  • Si pasa un Byte matriz a continuación, se va a crear un nuevo MemoryStream por todas partes que usted utiliza?
  • En el momento en que yo uso MemoryStream. Tengo una envoltura alrededor de MemoryStream y un método que convertir MemoryStream a la matriz de bytes.
  • ¿De qué tamaño son los resultados? Eso es lo que más importa.
  • Holterman 20-150 KB
  • OK, eso significa que usted no tiene que preocuparse acerca de la fragmentación.

InformationsquelleAutor LuckyStrike | 2012-08-06

3 Comentarios

  1. 51

    Si usted tiene que mantener todos los datos en la memoria, luego de muchas formas, la elección es arbitraria. Si tiene código existente que opera en Stream, entonces MemoryStream puede ser más cómodo, pero si usted devuelve un byte[] siempre puedes envolver que en un new MemoryStream(blob) de todos modos.

    También podría depender de lo grande que es y por cuánto tiempo se mantiene durante; MemoryStream puede ser de gran tamaño, que tiene ventajas y desventajas. Forzar a un byte[] puede ser útil si usted está sosteniendo los datos por un tiempo, ya que se va a recortar cualquier exceso; sin embargo, si usted está solo en el mantenimiento brevemente, puede ser contraproducente, ya que te obligará a duplicado la mayoría (en un mínimo absoluto: la mitad) de los datos durante la creación de la nueva copia.

    Así, depende mucho del contexto, uso y propósito. En la mayoría de los escenarios, «lo que funciona, y es claro y sencillo» puede ser suficiente. Si los datos es particularmente grande o mantenidas por un período de tiempo prolongado, puede que desee deliberadamente retocarlo un poco.

    Una de las ventajas adicionales de la byte[] enfoque: si es necesario, varios hilos pueden acceder de manera segura a la vez (como siempre que se de lectura) – esta no es cierto de MemoryStream. Sin embargo, que puede ser una falsa ventaja: la mayoría de código no necesidad para acceder a la byte[] de varios subprocesos.

    • Curiosamente, MemoryStream utiliza byte[] internamente en cualquier caso, lo que se convierte en más de una discusión acerca de lo que API es necesaria – la Stream o la matriz.
    • exactamente; el de gran tamaño interna byte[] está disponible a través de GetBuffer(), pero luego hay que ser muy cuidadoso de no mirar el fuera-de-rango de bytes, que son pura basura.
    • Hilo de seguridad es la principal razón para esta pregunta. Otra razón es que mi código utiliza matrices de bytes como parámetros.
    • entonces usted haría bien para simplemente volver byte[] a través de ms.ToArray(), o si a realmente quiere evitar la copia extra, un new ArraySegment<byte>(ms.GetBuffer(), 0, (int)ms.Length)
    • ArraySegment pueden no ser compatibles (como parámetro), ToArray corre el riesgo de fragmentación.
    • sí, pero para evitar la fragmentación, usted tendría que usar GetBuffer(), y si el buffer no está 100% completo (casi todos los casos), usted tendría que usar algo como ArraySegment<byte> – tal vez un byte[] más int length.

  2. 3

    MemoryStream clase se utiliza para agregar elementos a un arroyo.
    Hay un puntero a un archivo; Se simula de acceso aleatorio, depende de cómo se implementa. Por lo tanto, un MemoryStream no está diseñado para acceder a cualquier elemento en cualquier momento.

    La matriz de bytes que permite el acceso aleatorio de cualquier elemento en cualquier momento hasta que esté sin asignar.

    Junto a el byte [], MemoryStream vive en la memoria (dependiendo del nombre de la clase). A continuación, el tamaño máximo de asignación es de 4 GB.

    Finalmente, el uso de un byte [] si necesita acceder a los datos en cualquier número de índice. De lo contrario, MemoryStream está diseñado para trabajar con algo más que requiere un flujo de entrada, mientras que usted sólo tiene una cadena.

  3. 1

    Utilizar un byte [], porque es un fijo objeto del tamaño de lo que es más fácil para la asignación de memoria y de limpieza y mantiene relativamente sin sobrecarga – especialmente ya que no es necesario para utilizar las funciones de la MemoryStream. Además, usted desea conseguir que el flujo de eliminarse lo antes posible por lo que puede liberar los posibles recursos no administrados que puedan estar usando.

    • Un MemoryStream cuenta sin recursos no administrados para la liberación. Forzar a un byte[] puede tomar más de la memoria, debido a la duplicación. Mi punto: no es tan sencillo.

Dejar respuesta

Please enter your comment!
Please enter your name here