En mi código de rol de Azure, descargo un archivo de 400 megabytes que se divide en fragmentos de 10 megabytes y se almacena en Blob Storage. Yo uso CloudBlob.DownloadToStream()
para la descarga.¿Por qué escribir en un MemoryStream es más lento que en un archivo?
Intenté dos opciones. Uno está usando un FileStream
- creo un "write" FileStream
y descargo trozos uno por uno en la misma corriente sin rebobinar y así termino con un archivo original. La otra opción es crear un objeto MemoryStream
pasando un número ligeramente mayor que el tamaño del archivo original como el tamaño de la secuencia (para evitar reasignaciones) y descargando los fragmentos en ese MemoryStream
- de esta manera termino con un MemoryStream
que contiene los datos del archivo original.
aquí hay algo de pseudocódigo:
var writeStream = new StreamOfChoice(params);
foreach(uri in urisToDownload) {
blobContainer.GetBlobReference(uri).DownloadToStream(writeStream);
}
Ahora, la única diferencia es que se trata de un FileStream
en un caso y un MemoryStream
en el otro, todo el resto es el mismo. Resulta que tarda unos 20 segundos con un FileStream
y unos 30 segundos con un MemoryStream
- sí, el FileStream
resulta ser más rápido. De acuerdo con el contador de rendimiento \Memory\Available Bytes
, la máquina virtual tiene aproximadamente 1 gigabyte de memoria disponible en el momento anterior a la creación de MemoryStream
, por lo que no se debe a paginación.
¿Por qué escribir en un archivo sería más rápido que en un MemoryStream
?
¿Estás seguro de que tu flujo de memoria no se está intercambiando? – Oded
Interesante pregunta: si no hay buscapersonas, MemoryStream debería ser mucho más rápido. ¿Qué tamaño de instancia estás usando? Y podría publicar algún código (incluso si esto probablemente no importa ya que simplemente está llamando a la biblioteca de Storage Client). –
¿Tiene 1 GB de memoria * física * o 1 GB de memoria * virtual *? – Servy