В моем коде роли Azure я загружаю файл 400 мегабайт, который разделен на 10 мегабайт и хранится в хранилище Blob. Я использую CloudBlob.DownloadToStream()
для загрузки.
Я попробовал два варианта. Один использует FileStream
- я создаю "пишу" FileStream
и загружаю куски один за другим в один и тот же поток без перематывания, и поэтому я получаю исходный файл. Другой вариант - создать объект MemoryStream
, передав число, немного большее, чем исходный размер файла, в качестве размера потока (чтобы избежать перераспределения) и загрузки фрагментов в этот MemoryStream
- таким образом, я получаю MemoryStream
сохраняя исходные данные файла.
Здесь некоторый псевдокод:
var writeStream = new StreamOfChoice( params );
foreach( uri in urisToDownload ) {
blobContainer.GetBlobReference( uri ).DownloadToStream( writeStream );
}
Теперь единственное отличие состоит в том, что в одном случае a FileStream
и a MemoryStream
в другом, все остальное одно и то же. Оказывается, это занимает около 20 секунд с FileStream
и около 30 секунд с MemoryStream
- да, FileStream
оказывается быстрее. Согласно счетчику производительности \Memory\Available Bytes
виртуальная машина имеет около 1 ГБ памяти, доступную в настоящий момент до создания MemoryStream
, поэтому она не из-за пейджинга.
Почему запись в файл будет быстрее, чем MemoryStream
?