Nel mio codice ruolo Azure, scarica un file da 400 megabyte che viene suddiviso in blocchi da 10 megabyte e archiviato in Blob Storage. Io uso CloudBlob.DownloadToStream()
per il download.Perché la scrittura su un MemoryStream è più lenta rispetto a un file?
Ho provato due opzioni. Uno sta usando un FileStream
- Creo un "write" FileStream
e scarica pezzi uno alla volta nello stesso flusso senza riavvolgere e così finisco con un file originale. L'altra opzione è la creazione di un oggetto MemoryStream
passando un numero leggermente più grande della dimensione del file originale della dimensione dello stream (per evitare riallocazioni) e scaricando i blocchi in tale MemoryStream
- in questo modo finisco con un MemoryStream
contenente i dati del file originale.
Ecco alcuni pseudocodice:
var writeStream = new StreamOfChoice(params);
foreach(uri in urisToDownload) {
blobContainer.GetBlobReference(uri).DownloadToStream(writeStream);
}
Ora l'unica differenza è che si tratta di un FileStream
in un caso e un MemoryStream
nell'altra, tutto il resto è la stessa. Si scopre che ci vogliono circa 20 secondi con un FileStream
e circa 30 secondi con un MemoryStream
- sì, lo FileStream
risulta essere più veloce. Secondo il contatore delle prestazioni \Memory\Available Bytes
, la macchina virtuale ha una memoria di circa 1 gigabyte disponibile al momento prima della creazione dello MemoryStream
, quindi non è dovuto al paging.
Perché scrivere su un file è più veloce di un MemoryStream
?
Sei sicuro che il tuo flusso di memoria non stia cambiando? – Oded
Interessante domanda, se non ci sono impaginazioni su MemoryStream dovrebbe essere molto più veloce. Quale dimensione dell'istanza stai usando? E potresti pubblicare del codice (anche se questo probabilmente non ha importanza dal momento che stai semplicemente chiamando la libreria di Storage Client). –
Hai 1 GB di memoria * fisica * o 1 GB di memoria * virtuale *? – Servy