【问题标题】:Azure blob parallel copy from one storage to another从一个存储到另一个存储的 Azure Blob 并行复制
【发布时间】:2015-10-02 12:37:35
【问题描述】:

我目前正在学习 blob 块存储。我想将块 blob 从一个存储复制到另一个存储帐户。通常在从系统上传到云时,我看到的示例是计算块大小,然后使用 PutBlock 和 PutBlockList。我想使用相同的方法从一个存储帐户复制到另一个。使用 DownloadBlockList 我可以获取 blockid,但我无法获取与 block id 关联的数据。

CloudStorageAccount storageAccount = CloudStorageAccount.Parse( ConfigurationManager.AppSettings["StorageConnectionString"]);

            CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container = cloudBlobClient.GetContainerReference("input");

            CloudBlockBlob blob = container.GetBlockBlobReference("Cloud.mp4");

            List<string> commitedBlocks = new List<string>();

            IEnumerable<ListBlockItem> blockItem = blob.DownloadBlockList(BlockListingFilter.All);
            commitedBlocks.AddRange(blob.DownloadBlockList(BlockListingFilter.Committed).Select(id => id.Name));
            ); 

如果我能够获取与块 id 关联的数据,那么我可以对块进行并行复制。

谢谢

【问题讨论】:

  • 一个澄清问题:您想将 blob 从一个存储帐户复制到另一个存储帐户,还是将文件并行上传到多个存储帐户?
  • 我所做的更多是为了我的学习。我想从一个存储帐户复制到另一个。如果正确,希望并行复制块以更快地复制

标签: azure azure-blob-storage


【解决方案1】:

如果您的目标是将 blob 从一个存储帐户复制到另一个存储帐户,则不必执行所有这些操作 :)。 Azure 存储 API 允许您执行服务器端异步复制操作。您只需向 Azure 存储服务发送一个请求,将 blob 从一个存储帐户复制到另一个,它就会执行复制操作。由于它是异步操作,您可能需要跟踪操作状态,以便知道复制操作何时完成。

    private static void AsyncCopyExample()
    {
        var sourceAccount = new CloudStorageAccount(new StorageCredentials("source-account-name", "source-account-key"), true);
        var sourceContainer = sourceAccount.CreateCloudBlobClient().GetContainerReference("source-container-name");
        var sourceBlockBlob = sourceContainer.GetBlockBlobReference("source-blob-name");
        var targetAccount = new CloudStorageAccount(new StorageCredentials("target-account-name", "target-account-key"), true);
        var targetContainer = sourceAccount.CreateCloudBlobClient().GetContainerReference("target-container-name");
        var targetBlockBlob = sourceContainer.GetBlockBlobReference("source-blob-name");
        var copyId = targetBlockBlob.StartCopyFromBlob(sourceBlockBlob);//This will initiate the copy operation
        //Following code can be used to check if the copy has been completed.
        var isCopyOperationInProgress = true;
        do
        {
            targetBlockBlob.FetchAttributes();
            if (targetBlockBlob.CopyState.Status == CopyStatus.Pending)
            {
                Thread.Sleep(1000); //Sleep for a second and then check again
            }
            else
            {
                isCopyOperationInProgress = false;
            }
        } while (isCopyOperationInProgress);
    }

您可能还会发现存储团队的这篇博文很有用:http://blogs.msdn.com/b/windowsazurestorage/archive/2012/06/12/introducing-asynchronous-cross-account-copy-blob.aspx

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 2021-06-27
    • 1970-01-01
    • 2016-11-25
    • 2022-01-11
    • 2021-08-25
    • 1970-01-01
    • 2015-10-22
    • 2020-03-29
    相关资源
    最近更新 更多