2011-10-03 52 views
3

我有兩個代碼示例:CloudBlobContainer.ListBlobs() - 使用ToList(),以降低交易成本

var container = new CloudBlobContainer("address"); 
var blobs = container.ListBlobs(); 
foreach (var blob in blobs) 
{ 
    //Do somthing 
} 

這:

var container = new CloudBlobContainer("address"); 
var blobs = container.ListBlobs().ToList(); 
foreach (var blob in blobs) 
{ 
    //Do somthing 
} 

將第二個例子給任何優勢「交易 - 明智的」 ?
多少交易都到Blob存儲在每個實施例?

+1

林不知道你說你的問題,你打算,閱讀我的BLOB信息的評論時,發現這裏:http://toolheaven.net/post/How-to-do-a-fast-recursive-local-文件夾tofrom-蔚的Blob存儲synchronization.aspx#評論 –

+0

@馬丁:是的,我會說'。哪裏(...)的SingleOrDefault()'讓世界上所有的差異。 – mellamokb

回答

4

編輯:看來這個問題是參照blog post by Martin Ingvar Kofoed Jensen。這個問題和這個問題的區別在於撥打.Where(...).SingleOrDefault()。因爲LINQ是懶評估,在Container.ListBlobs()階段它仍然是一個IEnumerable且尚未被稱爲REST API(沒有數據被檢索)。一旦發生的操作的結果(如ToList()SingleOrDefault())時,數據被下載。由於非延遲的操作被稱爲在下面的代碼內環路懶名單上,它每次循環招致交易:

foreach (string filePath in allFilesInStartFolder) 
{ 
    string fileHash = GetFileHashFromCache(filePath, lastSync); 

    /* Checking for added files */ 
    var blob = blobs.Where(b => b.LocalPath == filePath).SingleOrDefault(); 
    // ^^ This is a non-lazy op on a lazy evalution, so it causes a REST call. 
    .... 
} 

關於這個問題,因爲它實際上是寫:代碼段將產生single transaction(最多5,000個斑點)。我在LinqPad/Fiddler測試兩個代碼片段,我只看到一個single API call產生斑點的列表(代替了我們的存儲名稱與{的MyStore}):

https://{mystore}.blob.core.windows.net/ 
    {mystore}?restype=container&comp=list&delimiter=%2F&timeout=90 

根據對List Blobs REST API文檔,高達5000結果可以在一次調用中返回。所以,如果你想列出所有的斑點在整個容器,將需要最多(#斑點/ 5000)的交易。