gpt4 book ai didi

azure - 使用 MemoryStream 反序列化大块 blob

转载 作者:行者123 更新时间:2023-12-03 05:08:51 25 4
gpt4 key购买 nike

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

以这种方式使用 MemoryStream 是将文件反序列化为对象的最佳方式吗?

我主要关心的是 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);
}

关于azure - 使用 MemoryStream 反序列化大块 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29127290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com