使用 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
可以避免在处理文件之前将整个文件复制到内存中。它只会占用在下载文件时重复使用的内部缓冲区的大小。
要上传,可以使用OpenWrite
或UploadFromStream
,不要同时使用! OpenWrite
需要更少的内存。
BinaryFormatter formatter = new BinaryFormatter();
using (var stream = blob.OpenWrite())
{
formatter.Serialize(stream, value);
}
我需要反序列化从 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
可以避免在处理文件之前将整个文件复制到内存中。它只会占用在下载文件时重复使用的内部缓冲区的大小。
要上传,可以使用OpenWrite
或UploadFromStream
,不要同时使用! OpenWrite
需要更少的内存。
BinaryFormatter formatter = new BinaryFormatter();
using (var stream = blob.OpenWrite())
{
formatter.Serialize(stream, value);
}