使用MemoryStream反序列化大块blob

时间:2015-03-18 16:20:25

标签: azure azure-storage-blobs memorystream binaryformatter

我需要反序列化从Azure Blob存储下载的大文件。

以这种方式使用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);
}

1 个答案:

答案 0 :(得分:3)

使用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();
using (var stream = blob.OpenWrite())
{
    formatter.Serialize(stream, value);
}