使用MemoryStream反序列化一个大块的blob

0 人关注

我需要对从Azure Blob Storage下载的大文件进行反序列化。

以这种方式使用 MemoryStream ,是否是将文件反序列化为 object 的最理想方式?

我主要担心的是RAM的使用。

BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
    blob.DownloadToStream(stream);
    stream.Position = 0;
    return formatter.Deserialize(stream);

另一个选择是将整个文件作为一个字节数组下载。请注意,这个文件的大小可能达到50MB。

从Guillaume的回答中进一步了解。

那么,在序列化和上传时,这样做是否更理想?

BinaryFormatter formatter = new BinaryFormatter();
using (var stream = blob.OpenWrite())
    formatter.Serialize(stream, value);
    blob.UploadFromStream(stream);
    
azure
azure-blob-storage
memorystream
binaryformatter
Dave New
Dave New
发布于 2015-03-19
1 个回答
Guillaume
Guillaume
发布于 2015-03-19
已采纳
0 人赞同

使用 CloudBlockBlob.OpenRead 方法来减少内存压力。

BinaryFormatter formatter = new BinaryFormatter();
using (var stream = blob.OpenRead())
    return formatter.Deserialize(stream);

使用MemoryStream ,你在内存中下载整个文件(50mb),我猜测MemoryStream 的内部缓冲区将需要64mb。因此,下载到一个字节数组可以使用更少的内存,因为数组的容量与它的长度相匹配。 使用OpenRead ,你可以避免在处理前将整个文件复制到内存中。它只需要一个内部缓冲区的大小,这个缓冲区在下载文件时被重复使用。

要上传,你可以使用OpenWriteUploadFromStream ,不要同时使用!OpenWrite 将需要更少的内存。

BinaryFormatter formatter = new BinaryFormatter();