如何避免C#Azure API的大型Blob上传内存不足?

时间:2018-12-28 18:50:45

标签: c# .net azure blob azure-blob-storage

我正在尝试使用Microsoft.Azure.Storage.Blob(9.4.2)将非常大(> 100GB)的Blob上传到Azure。但是,看起来,即使使用基于流的Blob写入API,该库也会根据文件的大小分配内存(1.2GB的测试文件将导致2GB的进程内存占用)。我需要它来保持不变的内存。我的代码如下(使用UploadFromFile,UploadFromStream等类似的结果):

var container = new CloudBlobContainer(new Uri(sasToken));
var blob = container.GetBlockBlobReference("test");
const int bufferSize = 64 * 1024 * 1024; // 64MB
blob.StreamWriteSizeInBytes = bufferSize;
using (var writeStream = blob.OpenWrite())
{
    using (var readStream = new FileStream(archiveFilePath, FileMode.Open))
    {
        var buffer = new byte[bufferSize];
        var bytesRead = 0;
        while ((bytesRead = readStream.Read(buffer, 0, bufferSize)) != 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
        }
    }
}

这种行为令人莫名其妙-我在TaskMgr中看到确实确实开始上传,所以这不像是它在缓冲等待发送的内容。没有理由需要挂起以前发送的数据。有人会如何使用此API进行不重要的Blob上传?

1 个答案:

答案 0 :(得分:0)

我建议您看一下BlobStorageMultipartStreamProvider示例,因为它显示了请求流如何“转发”到 Azure Blob 流,这可能会减少使用的内存量在服务器端上传时。

希望有帮助!