【发布时间】:2021-09-04 11:11:31
【问题描述】:
我正在尝试上传 100GB 的数据。为此我从网上取了以下例子:
很遗憾,该文件没有出现在 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();
}
【问题讨论】:
-
我注意到您在代码中使用了很多 Console.Writeline。您在控制台中看到的最后一条消息是什么?你当然可以在 Azure 中上传 100GB 的文件。
-
我没有收到错误。但我在 azure 门户中看不到该文件。也许你有一个工作的例子?来自互联网的那些只有在您上传几 MB 时才有效......
-
你能分享一下控制台输出吗(只是最后几个 10 - 15 个输出)?
-
我必须再次运行它。在控制台中有所有输出。我现在登录然后发送;)
-
看看您是否也可以将输出记录到文件中,这样您就不必再次运行来捕获错误。此外,我建议从与存储帐户位于同一区域的 Azure VM 运行代码。上传速度会快很多。