使用 MemoryStream 反序列化大块 blob

Deserializing a large block blob using MemoryStream

我需要反序列化从 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。

编辑:

进一步从纪尧姆的回答:

那这样在序列化和上传时会不会更优化?

BinaryFormatter formatter = new BinaryFormatter();
using (var stream = blob.OpenWrite())
{
    formatter.Serialize(stream, value);
    blob.UploadFromStream(stream);
}

使用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);
}