CloudBlobContainer.ListBlobs() -使用ToList()来减少交易成本

本文关键字:交易 ToList ListBlobs 使用 CloudBlobContainer | 更新日期: 2023-09-27 18:10:14

我有两个代码示例:

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

和this:

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

第二个例子在"事务方面"有什么优势吗?
在每个示例中,对blob存储进行了多少事务处理?

CloudBlobContainer.ListBlobs() -使用ToList()来减少交易成本

Edit:这个问题似乎是参考了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.
    ....
}

关于实际编写的问题:两个代码片段将引发单个事务(最多5,000 blobs)。我在LinqPad/Fiddler中测试了这两个代码片段,我只看到一个API调用来生成blob列表(将我们的存储名称替换为{mystore}):

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

根据List Blobs REST API的文档,一次调用可以返回多达5,000个结果。因此,如果您想列出整个容器中的所有blobs,则最多需要(# blobs/5000)个事务。