【发布时间】:2022-08-03 20:42:40
【问题描述】:
我试图下载一个大小约为 350mb 的 blob。当我使用 blob sdk 时,它占用了 2gb 的内存。谁能告诉我为什么会这样?
var blobclient = blobContainerClient.GetBlobClient(blobName);
using (var stream = new MemoryStream())
{
await blobclient.DownloadToAsync(stream);
using (var streamReader = new StreamReader(stream))
{
var result = await streamReader.ReadToEndAsync();
}
}
-
你是如何测量这个的?
-
如果 blob 为 350 MB,则数组也将占用 350 MB——至少,因为在内部它可能会因动态分配而变大。然后最重要的是,您使用
StreamReader生成的字符串将占用另外 700 MB 左右,假设 blob 主要是 ASCII 数据,因为字符串在内部是 UTF-16 编码的。由运行时投入一些急切的内存分配,您很可能会在预期之前达到 2 GB 标记。根据您对 blob 所做的操作,可能存在优化空间;更多流媒体是一种明显的方法。 -
@JeroenMostert 当我们得到基本上是 xml 字符串的 blob 时。我们希望将其转换为对象以进行额外处理。
-
这并不排除使用流媒体。您可以使用
blobClient.DownloadStreaming()和BlobDownloadStreamingResult直接访问Stream。然后,您可以使用该流创建一个XmlReader,它可以在您构建对象表示时使用selectively read from the blob,或者(如果您真的想拥有这一切)使用XElement.Load。这些方法中的任何一种都将绕过生成巨大的中间字节数组或字符串。
标签: c# .net azure azure-blob-storage