我正在尝试将300GB(流式)数据上传到Azure blob存储。 我用来执行上传的代码如下所示:
var stream = blob.OpenWrite();
[...]
// the buffer is filled in with 128KB chunks of data from a larger 300GB file
stream.Write(buffer, offset, count);
上传大约8小时后,我收到以下错误消息:
at Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult`1.End() 在c:\ Program Files中 86)\詹金斯\工作空间\ release_dotnet_master \ LIB \ ClassLibraryCommon \核心\的Util \ StorageAsyncResult.cs:线 77点 Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.EndWrite(IAsyncResult的 c:\ Program Files中的asyncResult) (86)\詹金斯\工作空间\ release_dotnet_master \ LIB \ ClassLibraryCommon \斑点\ BlobWriteStream.cs:线 211
ErrorMessage =客户端无法完成其中的操作 指定超时。
作为旁注,我的上传速度约为2MB / s(可能与超时消息有关)。任何帮助将不胜感激。
答案 0 :(得分:3)
根据您的说明和错误消息,如果您不希望它快速超时,我建议您尝试将BlobRequestOptions.MaximumExecutionTime的值更改为更长。
我建议您还可以启用存储诊断日志来查看存储分析日志和指标,以查看延迟是服务器还是端到端延迟。 有关监控,诊断和排除Microsoft Azure存储故障的更多详细信息,您可以参考此article。
此外,我建议您尝试使用Microsoft Azure存储数据移动库将大型文件上传到blob存储。
这是专为高性能上载,下载和复制Azure存储Blob和文件而设计的。您可以从VS nuget包管理器安装它。
有关如何使用它的更多详细信息,请参阅此article。
这是一个例子:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
"connectstring");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference("foobar");
blobContainer.CreateIfNotExists();
string sourcePath = @"yourfilepath";
CloudBlockBlob destBlob = blobContainer.GetBlockBlobReference("foobar");
TransferManager.Configurations.ParallelOperations = 64;
SingleTransferContext context = new SingleTransferContext();
context.ProgressHandler = new Progress<TransferStatus>((progress) =>
{
Console.WriteLine("Bytes uploaded: {0}", progress.BytesTransferred);
});
var task = TransferManager.UploadAsync(
sourcePath, destBlob, null, context, CancellationToken.None);
task.Wait();
它将自动将每个块发送到azure存储,如下所示:
答案 1 :(得分:3)
此问题已在8.1.3版本中解决(之前我使用的是8.1.1)。他们的changelogs:
中也提到了这一变化
- Blobs(桌面):修正了一个没有遵守MaximumExecutionTime的错误,导致无限等待,如果由于失败,例如收到响应头后网络故障,服务器停止发送部分响应。
- 全部(桌面):修复了在重试,取消和表操作期间未处理SendStream的内存泄漏问题。
基本上,在8.1.3之前,BlobRequestOptions.MaximumExecutionTime
被忽略了。