首页 > 解决方案 > 将 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();
    }

标签: azure-blob-storage

解决方案


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


推荐阅读