我需要反序列化从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);
}
答案 0 :(得分:3)
使用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);
}