2015-11-09 46 views
1
TableBatchOperation

在.NET SDK文档中说,我可以测量TableBatchOperation的大小吗?

批处理操作可以包含多达100个单独的表操作,与各经营单位必须具有相同的分区键的要求。具有检索操作的批处理不能包含任何其他操作。请注意,批量操作的总有效负载限制为4MB。

这很容易,以确保我不添加超过100个单独的表操作的批次:在最坏的情况下,我可以检查Count属性。但是除了手动序列化操作之外,是否有任何方法来检查有效负载大小(在这一点上,我已经失去了使用SDK的大部分好处)?

回答

3

在添加实体时,您可以跟踪名称的大小和数据。假设您使用的是默认为Json的较新库,则添加的附加字符应该相对较小(与数据相比,如果您接近4MB)并且可以估算。这不是一条完美的路线,但它会让你接近。

当你走时序列化,特别是如果你实际上接近100个实体的限制或4MB的限制经常会失去你很多的性能,除了丢失的任何便利。您可能最好是按照原样发送批处理请求,并且如果您得到的413指示请求体太大,最好赶上错误,将批处理分成两部分,然后继续。

1

我遵循Emily Gerner的建议,使用乐观插入和错误处理,但使用StorageException.RequestInformation.EgressBytes来估计符合极限的操作数。除非操作规模变化很大,否则这应该更有效率。每次都有一个案例可以不提高len,但是这里有一个每次都会变得乐观的实现。

 int off = 0; 
     while (off < ops.Count) 
     { 
      // Batch size. 
      int len = Math.Min(100, ops.Count - off); 
      while (true) 
      { 
       var batch = new TableBatchOperation(); 
       for (int i = 0; i < len; i++) batch.Add(ops[off + i]); 

       try 
       { 
        _Tbl.ExecuteBatch(batch); 
        break; 
       } 
       catch (Microsoft.WindowsAzure.Storage.StorageException se) 
       { 
        var we = se.InnerException as WebException; 
        var resp = we != null ? (we.Response as HttpWebResponse) : null; 
        if (resp != null && resp.StatusCode == HttpStatusCode.RequestEntityTooLarge) 
        { 
         // Assume roughly equal sizes, and base updated length on the size of the previous request. 
         // We assume that no individual operation is too big! 
         len = len * 4000000/(int)se.RequestInformation.EgressBytes; 
        } 
        else throw; 
       } 
      } 

      off += len; 
     } 
相关问题