我有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試圖構建聚集索引。 如何加快速度?問題是什麼?
'GetFiles'返回字符串,對吧?但'StoreFile'需要一個流...我錯過了什麼? (我想知道你在哪裏處理這個流,也許有些東西在泄漏)。你可能想要做'for(int i = 0; i <100000; i ++){container.GetBlobReference(Guid.NewGuid()。ToString ())UploadText(i.ToString())。 }來簡化你正在測量的內容。 – smarx 2012-07-31 08:07:59
我不認爲這些memleaks或處理上傳速度的影響。流是通過調用File.OpenRead(filename) – brainstream 2012-07-31 08:24:11
創建的,那些流是否正確放置? – smarx 2012-07-31 08:52:59