c# - 在 blob 存储中并行上传 block

标签 c# azure azure-blob-storage parallel.foreach

我正在尝试将其转换为并行以提高文件的上传时间,但根据我的尝试,它并没有及时发生很大的变化。 我想并排上传 block 然后确认它们。我怎样才能并行地做到这一点?

public static async Task UploadInBlocks
    (BlobContainerClient blobContainerClient, string localFilePath, int blockSize)
{
    string fileName = Path.GetFileName(localFilePath);
    BlockBlobClient blobClient = blobContainerClient.GetBlockBlobClient(fileName);

    FileStream fileStream = File.OpenRead(localFilePath);

    ArrayList blockIDArrayList = new ArrayList();

    byte[] buffer;

    var bytesLeft = (fileStream.Length - fileStream.Position);

    while (bytesLeft > 0)
    {
        if (bytesLeft >= blockSize)
        {
            buffer = new byte[blockSize];
            await fileStream.ReadAsync(buffer, 0, blockSize);
        }
        else
        {
            buffer = new byte[bytesLeft];
            await fileStream.ReadAsync(buffer, 0, Convert.ToInt32(bytesLeft));
            bytesLeft = (fileStream.Length - fileStream.Position);
        }

        using (var stream = new MemoryStream(buffer))
        {
            string blockID = Convert.ToBase64String
                (Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));
            
            blockIDArrayList.Add(blockID);


            await blobClient.StageBlockAsync(blockID, stream);
        }

        bytesLeft = (fileStream.Length - fileStream.Position);

    }

    string[] blockIDArray = (string[])blockIDArrayList.ToArray(typeof(string));

    await blobClient.CommitBlockListAsync(blockIDArray);
}

最佳答案

当然。您不应该期待任何改进 - 恰恰相反。 Blob 存储没有任何简单的吞吐量限制,而这将受益于在多个流中上传,并且您已经在执行极轻量级 I/O,这将完全受 I/O 限制。

好的 I/O 代码绝对不会从并行化中获得任何好处。无论您部署多少工作人员,管道都只有这个粗,并且不允许您传递更多数据。

您的所有代码都只是重新实现了 blob 存储库所具有的已经非常有效的机制...而且您做得更糟,有无意义的分配、错误的参数和新的错误机会。不要那样做。该库可以很好地处理流。

关于c# - 在 blob 存储中并行上传 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75225937/

相关文章:

c# - 相机跟随实例化光子多人游戏

c# - 显示数据的 GridView

azure - 如何复制托管数据库?

c# - 使用 .NET 在 Azure Scheduler 上安排任务

azure - ServicePointManager SetTcpKeepAlive

azure - 将上传到 Azure Blob 的文件与本地文件进行比较

c# - C# 中的斐波那契、二进制或二项式堆?

c# - Entity Framework - 反向属性关系?

azure - 查询 Azure 存储帐户已用容量 - PowerShell 脚本?

Azure 函数将文件上传到 Azure Blob