4

2つのコード例があります:

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
}

2番目の例は、「トランザクションに関して」何らかの利点をもたらしますか?
各例では、BLOBストレージに対していくつのトランザクションが実行されますか?

4

1 に答える 1

5

編集:この質問は、Martin IngvarKofoedJensenによるブログ投稿を参照しているようです。この質問とその質問の違いは、への呼び出し.Where(...).SingleOrDefault()です。LINQは遅延評価されているため、その段階でContainer.ListBlobs()はまだIEnumerableREST 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.
    ....
}

実際に書かれている質問について:両方のコードスニペットで1つのトランザクション(最大5,000 BLOB)が発生します。LinqPad / Fiddlerで両方のコードスニペットをテストしましたが、blobのリストを生成するためのAPI呼び出しが1つしか表示されません(ストレージ名を{mystore}に置き換えました)。

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

List Blobs REST APIのドキュメントによると、1回の呼び出しで最大5,000件の結果を返すことができます。したがって、コンテナ全体のすべてのBLOBを一覧表示する場合は、最大(#BLOB / 5000)のトランザクションが必要になります。

于 2011-10-03T15:38:12.763 に答える