【问题标题】:Upload 100Gb to azure blob storage将 100Gb 上传到 azure blob 存储
【发布时间】: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 运行代码。上传速度会快很多。

标签: azure-blob-storage


【解决方案1】:

您的上传失败的原因是您在其中拆分 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

【讨论】:

  • 嗨,是的。现在它是天蓝色的。非常感谢!为什么上传的文件大小不一样?在我的本地驱动器 100 GB(107,374,182,400 字节)和 azure 3.13 GiB 上?
  • 我应该计算大小:3GiB * Blocksize = 3Gib * 32 *1024 * 1024?
  • 如果我得到了 blob 的长度:myBlob.Properties.Length;我只得到 3355443200。我怎样才能得到正确的尺寸?
  • 如果我从 azure 门户下载文件(下载按钮),我会得到一个大小为 3,355,443,200 字节的文件....
  • 还有别的东西。您可以编辑您的问题并将您的最新代码添加为问题的更新吗?请不要更改您发布的原始代码,因为它会改变问题的上下文。或者,您可以复制 pastebin 上的代码并共享该链接。
猜你喜欢
  • 2023-03-28
  • 2019-05-26
  • 2014-08-23
  • 2021-10-13
  • 2018-12-17
  • 2020-08-01
  • 2017-01-24
  • 2017-08-19
  • 2018-12-28
相关资源
最近更新 更多