azure-blob-storage - 将 100Gb 上传到 Azure Blob 存储
问题描述
我正在尝试上传 100GB 的数据。为此,我从 Internet 上获取了以下示例:
不幸的是,该文件不会出现在 Azure 中,即使上传不会产生任何错误。另一方面,较小的文件会在上传后出现。
是否可以将 100GB 文件上传到 Azure Blob?我尝试了许多示例列表,但都没有奏效?我需要去 AWS 吗?
这是我的代码:
public void UploadStreamAsync(string file)
{
var fileInfo = new FileInfo(file);
CloudBlockBlob myBlob = _container.GetBlockBlobReference(fileInfo.Name);
var blockSize = 1024 * 1024;
myBlob.StreamWriteSizeInBytes = blockSize;
var fileName = fileInfo.FullName;
long bytesToUpload = fileInfo.Length;
long fileSize = bytesToUpload;
if (bytesToUpload < blockSize)
{
CancellationToken ca = new CancellationToken();
var ado = myBlob.UploadFromFileAsync(fileName);
Console.WriteLine(ado.Status); //Does Not Help Much
ado.ContinueWith(t =>
{
Console.WriteLine("Status = " + t.Status);
Console.WriteLine("It is over"); //this is working OK
});
}
else
{
List<string> blockIds = new List<string>();
int index = 1;
long startPosition = 0;
long bytesUploaded = 0;
do
{
var bytesToRead = Math.Min(blockSize, bytesToUpload);
var blobContents = new byte[bytesToRead];
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
fs.Position = startPosition;
fs.Read(blobContents, 0, (int)bytesToRead);
}
ManualResetEvent mre = new ManualResetEvent(false);
var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(index.ToString("d6")));
Console.WriteLine("Now uploading block # " + index.ToString("d6"));
blockIds.Add(blockId);
var ado = myBlob.PutBlockAsync(blockId, new MemoryStream(blobContents), null);
ado.ContinueWith(t =>
{
bytesUploaded += bytesToRead;
bytesToUpload -= bytesToRead;
startPosition += bytesToRead;
index++;
double percentComplete = (double)bytesUploaded / (double)fileSize;
Console.WriteLine("Percent complete = " + percentComplete.ToString("P"));
mre.Set();
});
mre.WaitOne();
}
while (bytesToUpload > 0);
Console.WriteLine("Now committing block list");
var pbl = myBlob.PutBlockListAsync(blockIds);
pbl.ContinueWith(t =>
{
Console.WriteLine("Blob uploaded completely.");
});
}
Console.ReadKey();
}
解决方案
您的上传失败的原因是,您在其中拆分 blob 的块数 (102400) 超过了块 blob 中允许的最大块数 (50000)。
要解决此问题,请将您的块大小从 1MB 增加到 4MB(或更多,具体取决于您的互联网速度)。这样你的块数将在 25000 左右。
您需要做的基本上是更改以下代码行:
var blockSize = 1024 * 1024;
至
var blockSize = 4 * 1024 * 1024;
基本思想是保持块 blob 中的块数小于 50000。
要了解更多信息,请参阅:https ://docs.microsoft.com/en-us/rest/api/storageservices/put-block#remarks 。
推荐阅读
- java - 扩展应该不那么通用的泛型类
- cakephp-3.0 - CakePHP 一些表单在提交时立即重定向而没有表单数据
- shell - 通过使用命令行参数调用 curl 在请求正文中发送数据
- angular - 表单控件的角度设置值给出错误
- .net - Azure Application Insights 是否提供任何内置方法来匿名化用户数据?
- javascript - 如何在Javascript中找到数组中最后一个重复元素的索引?
- java - Html2Pdf 转换器禁用文本选择
- javascript - 如何在加载此 React 组件时触发此功能,而不是需要单击按钮?
- node.js - 任何想法/帮助如何让“npm start”工作
- jsf - 如何从命令更新progressBar