繁体   English   中英

Azure blob存储 - 上传速度非常慢

[英]Azure blob storage - uploading very slow

我在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文件的上传时间为20-30分钟,然后速度下降。 我认为这可能是由于文件名是GUID而Azure尝试构建聚簇索引。 怎么加快? 问题是什么?

要上传许多小文件,您应该使用多个线程。 例如,您可以使用BeginUploadFromStreamParallel.ForEach

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

我建议你在开始blob上传之前只调用一次这个函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM