C# Azure blob存储-上载速度非常慢

C# Azure blob存储-上载速度非常慢,c#,.net,azure,azure-storage-blobs,C#,.net,Azure,Azure Storage Blobs,我在azure blob存储中拥有试用帐户。我尝试从本地机器上传100000个生成的文件。该操作的持续时间已超过17小时,仅上载了约77000个文件。 由简单bash脚本创建的所有文件: for i in {1..100000} do echo $i echo $i > $1\\$i.txt done 上传代码: using(var stream = File.OpenWrite(textBoxManyUploadFileName.Text)) using(var wri

我在azure blob存储中拥有试用帐户。我尝试从本地机器上传100000个生成的文件。该操作的持续时间已超过17小时,仅上载了约77000个文件。 由简单bash脚本创建的所有文件:

for i in {1..100000}
do
    echo $i
    echo $i > $1\\$i.txt
done
上传代码:

using(var stream = File.OpenWrite(textBoxManyUploadFileName.Text))
using(var writer = new StreamWriter(stream)) {
    foreach(var file in Directory.GetFiles(textBoxManyUploadFrom.Text)) {
        Guid id = Guid.NewGuid();
        storage.StoreFile(file, id, ((FileType)comboBoxManyUploadTypes.SelectedItem).Number);
        writer.WriteLine("{0}={1}", id, file);
    }
}

public void StoreFile(Stream stream, Guid id, string container) {
    try {
        var blob = GetBlob(id, container);
        blob.UploadFromStream(stream);
    } catch(StorageException exception) {
        throw TranslateException(exception, id, container);
    }
}

public void StoreFile(string filename, Guid id, int type = 0) {
    using(var stream = File.OpenRead(filename)) {
        StoreFile(stream, id, type);
    }
}

CloudBlob GetBlob(Guid id, string containerName) {
    var container = azureBlobClient.GetContainerReference(containerName);
    if(container.CreateIfNotExist()) {
        container.SetPermissions(new BlobContainerPermissions {
            PublicAccess = BlobContainerPublicAccessType.Container
        });
    }
    return container.GetBlobReference(id.ToString());
}
前10000个文件被bean上传了20-30分钟,然后速度降低了。 我认为这可能是因为文件名是GUID,Azure试图构建聚集索引。
如何加速?问题是什么?

要上载许多小文件,应该使用多个线程。
例如,您可以使用或。

我在代码中注意到的另一件事是,您正在StoreFile()函数中调用GetBlob()函数,而StoreFile()函数又在blob容器上调用CreateIfNotExist()函数。请注意,此函数还会导致调用存储服务,从而增加上载过程的延迟(更不用说每次调用此函数时,您还需要为存储事务付费)


我建议您在开始blob上载之前只调用此函数一次。

对于前10000个文件,CreateIfNotExist()没有扮演任何角色。为什么前10000个文件上载得很快?请使用探查器查找瓶颈。它可能是您的日志:writer.WriteLine(“{0}={1}”,id,file);您是否也在使用最新的SDK?谢谢您的建议。我已经尝试使用本地文件保存,它们在大约20分钟内就被写入了。所以,问题不在我的代码中。是的,我使用的是最新的SDK。我在两台机器上运行了我的测试应用程序,速度提高了一倍。并行上传必须帮助我完成最终任务。谢谢大家!<代码>获取文件返回字符串,对吗?但是
StoreFile
需要一个流。。。我错过了什么?(我想知道你在哪里处理这个流。可能有什么东西在泄漏。)你可能只想对(int I=0;I<100000;I++){container.GetBlobReference(Guid.NewGuid().ToString()).UploadText(I.ToString());}做
,以简化你所测量的内容。我认为memleaks或disposing不会影响上传速度。流是通过调用File.OpenRead(filename)创建的,这些流是否被正确处理?根据上面的回答,您是否通过以下代码行中的File变量创建流:storage.StoreFile(File,id,((FileType)comboBoxManyUploadTypes.SelectedItem).Number);这一行实际上是storage.StoreFile(File.OpenRead(File),id,((FileType)comboBoxManyUploadTypes.SelectedItem.Number);而不是storage.StoreFile(stream,id,((FileType)comboBoxManyUploadTypes.SelectedItem.Number);在你的代码中。对吗?@smarx我已经更新了问题。