2009-06-12 14 views
8

Al utilizar un MemoryStream, me encuentro a menudo copiando (por lo tanto, duplicando) datos en una matriz temporal de bytes.MemoryStream frente a una matriz de bytes

Creo que es un desperdicio de recursos, porque MemoryStream dos veces no le permite acceder directamente a la matriz de bytes subyacente.

En esta situación, ¿cuál es la verdadera ventaja de un MemoryStream? He leído en alguna parte que actúa como un archivo mapeado en memoria. Los datos se traen desde el disco solo en el acceso, consumiendo menos memoria.

¿Es eso cierto? No lo creo. Tal vez es el caso de un FileStream?

Gracias por su aclaración.

+2

¿Qué idioma y qué biblioteca está utilizando? – thecoop

+0

C# - .NET framework. –

Respuesta

4

Para mí, la principal ventaja de una secuencia de memoria es que crece dinámicamente y está optimizada para hacerlo. Es es tener que copiar y duplicar memoria, pero si su uso principal es construir un búfer para ser entregado al final del proceso, esa falla se amortiza un poco.

Debo añadir que, a diferencia de FileStream, MemoryStreams es mucho, mucho más rápido. Tienen un tamaño más limitado que FileStreams, porque generalmente tiene mucho más espacio en disco que RAM. Entonces debes decidir si necesitas velocidad o espacio.

+0

Bueno, en ambos casos (MemoryStream o FileStream), los métodos de lectura y escritura toman un número entero para el desplazamiento y el recuento. Entonces creo que pueden subir al mismo tamaño. –

+0

Teóricamente pueden, pero recuerden que MemoryStream está almacenado en la memoria, por lo que cuando la memoria RAM está llena, comienza a paginar, lo que provocará ralentizaciones de la aplicación y, después de un tiempo, la ralentización del sistema (debido a que la RAM y la página están llenas). –

+0

Sí, una cosa graciosa que noté es que la propiedad Length de una secuencia es larga (8 bytes). Ni siquiera puede hacer referencia a un archivo tan grande con los métodos de lectura y escritura. Estoy bastante seguro de que tiene algo que ver con la API win32 nativa. –

3

Usted puede obtener el buffer de bytes subyacente utilizando la función getBuffer (pero sólo si ha creado el MemoryStream a partir de una matriz de bytes que ha proporcionado, que es útil si usted quiere ser capaz de manipular el buffer directamente)

La única ventaja de utilizar un MemoryStream es si está utilizando una API basada en secuencias, o si necesita que el búfer de bytes pueda crecer dinámicamente ...

+1

"solo si ... desde una matriz de bytes que proporcionó" no es verdadero. Compruebe [los documentos] (http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx): devuelve 'la matriz de bytes desde la cual se creó esta secuencia, o la matriz subyacente si no se proporcionó una matriz de bytes al constructor MemoryStream durante la construcción de la instancia actual. "En realidad, si proporciona una matriz en la construcción y desea que la devuelva' GetBuffer', debe usar la sobrecarga del constructor con la bandera 'publiclyVisible' y establecer eso en 'true', de lo contrario obtendrás' UnauthorizedAccessException'. –

Cuestiones relacionadas