2011-05-11 133 views
7

我們目前在同一個Azure容器下有數千個文件的blob存儲。我們的文件命名規則是這樣的:提高azure blob存儲查詢速度

StorageName \隊伍\工作小組\文件名

我正在寫顯示文件爲每個特定工作小組的工具。該代碼獲取Container的Blob列表,然後爲每個嘗試匹配正確的Team \ Subteam的對象(請參閱下面的示例代碼)。

這有效,但速度非常慢(因爲我需要瀏覽所有文件以查看它們是否與特定的小組匹配)。有沒有提高查詢速度的方法?我可以考慮優化,例如「找到與您正在查找的團隊相匹配的第一個文件,然後在您發現不同的團隊早點退出時保持跟蹤」,但會假定BlobList已排序並且不會修復最壞的情況。

不幸的是,在不同容器下分割文件目前不是一個選項。

下面是示例代碼:

IEnumerable<IListBlobItem> blobs = blobContainer.ListBlobs(
    new BlobRequestOptions() 
    { 
     UseFlatBlobListing = true, 
     BlobListingDetails = BlobListingDetails.Metadata 
    }).OfType<CloudBlob>(); 

foreach (var blob in blobs) { 
var cloudy = blob as CloudBlob; 

string blobTeamId = cloudy.Uri.Segments[2].Trim('/'); 
if (blobTeamId != teamId) 
     continue; 

//Do something interesting with the file 
+0

看起來像listblobs確實根據MSDN http://msdn.microsoft.com/en-us/library/dd135734.aspx進行排序。 – krolth 2011-05-11 01:31:34

回答

18

1解決方案 通過REST接口,你可以在

http://somwhere.com/mycontainername/?restype=container&comp=list&delimiter=/&prefix=\Team\SubTeam 

通過,這將返回的XML文檔,只有在子文件團隊「文件夾」(我知道它不是一個文件夾,但它看起來像一個工具)

您可能需要基因對共享訪問簽名進行評級以便能夠訪問它,您必須在URL的末尾標記該共享訪問簽名。

check out here

顯示位置,您可以通過blobname前綴過濾。

第二個解決方案 這可能更接近你想要的。如果您可以使用在azure sdk 1.3中更新的新存儲客戶端,則您現在可以使用

IEnumerable blobList = client.ListBlobsWithPrefix(「Team/SubTeam」);

其中Client是CloudBlobClient的一個實例。

編輯 - 2013年11月18日 它看起來像resttype不再支持作爲一個參數,它應該是restype。這似乎在週末悄然發生。我改變了上面的url例子。

2

你真的需要BlobListingDetails.Metadata嗎?這導致大量額外的信息被下載。我認爲,所有你需要的是名

3

只是一個更新...

可以使用通過GetDirectoryRefence然後列表斑點斑點得到的列表...

VAR子目錄= blobContainer.GetDirectoryReference (String.Format(「{0} /」,文件夾)); return subDirectory。ListBlobs(false,BlobListingDetails.Metadata);