【问题标题】:CloudBlobContainer.ListBlobs() - using ToList() to reduce transaction costCloudBlobContainer.ListBlobs() - 使用 ToList() 降低交易成本
【发布时间】:2011-10-03 15:18:44
【问题描述】:

我有两个代码示例:

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 存储进行了多少事务?

【问题讨论】:

  • 在阅读您对我的 blob 帖子的评论时,我不确定您是否按照您的意图表达了您的问题:toolheaven.net/post/…
  • @Martin:是的,我想说.Where(...).SingleOrDefault() 让世界变得与众不同。

标签: c# azure azure-storage azure-blob-storage


【解决方案1】:

编辑:这个问题似乎与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.
    ....
}

关于实际编写的问题:两个代码 sn-ps 都会产生 single transaction(最多 5,000 个 blob)。我在LinqPad/Fiddler 中测试了两个代码sn-ps,我只看到single API call 来生成blob 列表(将我们的存储名称替换为{mystore}):

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

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

【讨论】:

  • 数数呢?显然我可以毫无问题地计算 >5000 个文件
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2022-01-16
  • 2022-01-14
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多