2012-07-31 141 views
1

我有Azure blob存儲中的試用帳戶。我嘗試從本地機器上傳100000個生成的文件。該操作已經有超過17個小時的時間,並且只上傳〜77000個文件。 通過一個簡單的bash腳本創建的所有文件:Azure blob存儲 - 上傳速度非常慢

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試圖構建聚集索引。 如何加快速度?問題是什麼?

+0

'GetFiles'返回字符串,對吧?但'StoreFile'需要一個流...我錯過了什麼? (我想知道你在哪裏處理這個流,也許有些東西在泄漏)。你可能想要做'for(int i = 0; i <100000; i ++){container.GetBlobReference(Guid.NewGuid()。ToString ())UploadText(i.ToString())。 }來簡化你正在測量的內容。 – smarx 2012-07-31 08:07:59

+0

我不認爲這些memleaks或處理上傳速度的影響。流是通過調用File.OpenRead(filename) – brainstream 2012-07-31 08:24:11

+0

創建的,那些流是否正確放置? – smarx 2012-07-31 08:52:59

回答

2

要上傳很多小文件,您應該使用多個線程。 例如,您可以使用BeginUploadFromStreamParallel.ForEach

+0

爲什麼前10000個文件上傳得很快? – brainstream 2012-07-31 07:53:04

+0

使用分析器查找瓶頸。它可能是你的日誌:writer.WriteLine(「{0} = {1}」,id,file); 你還使用最新的SDK? – Guillaume 2012-07-31 08:41:55

+0

謝謝你的建議。我曾嘗試使用本地文件保存功能,並且它們已在~20分鐘內寫入。所以,問題不在我的代碼中。是的,我正在使用最新的SDK。 – brainstream 2012-07-31 09:13:58

1

我在代碼中注意到的另一件事是,您在StoreFile()函數中調用GetBlob()函數,該函數又會在您的blob容器上調用CreateIfNotExist()函數。請注意,此功能還會導致對Storage Service的調用,從而延長上傳過程的時間(更不用說每次調用此功能時還要爲存儲事務收費)。

我建議您在開始blob上傳之前調用此函數一次。

+0

對於第一個10000個文件,CreateIfNotExist()沒有扮演任何角色。 – brainstream 2012-07-31 07:50:04