2013-03-15 7 views
5

Zrobiłem wiele badań na temat przechowywania tabeli i jej ograniczeń rozmiaru, narzut itp wykorzystaniem tych źródeł:Windows Azure Storage Table limit rozmiaru wiersza jest mniejsza niż podano 1MB

Korzystając z tych informacji, napisałem trochę kodu, aby efektywnie przechowywać dane binarne na wielu właściwościach, obliczając dowolny wiersz i obciążenie nieruchomości oraz pozostając w granicach limitu właściwości 64KB i limitu rzędu 1 MB.

Niestety to po prostu nie działa. Dla przykładu przechowywanie około 0,5 MB zwraca 400 nieprawidłowych żądań stwierdzając, że encja jest zbyt duża - czego nie rozumiem, dlaczego miałby mieć limit wielkości rzędu 1 MB.

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <code>EntityTooLarge</code> 
    <message xml:lang="en-GB">The entity is larger than allowed by the Table Service.</message> 
</error> 

Kod używam jest dość prosta, ale może ja popełniałem błędy w szacowaniu narzut - jednak wątpię, że będzie się o 100% rozmiaru danych ..

class Program 
{ 
    static void Main(string[] args) 
    { 
     var client = CloudStorageAccount.DevelopmentStorageAccount.CreateCloudTableClient(); 
     var table = client.GetTableReference("sometable"); 
     table.CreateIfNotExists(); 

     const int rowOverhead = 4; 
     const int maxRowSize = 1024 * 1024; // 1MB row size limit 
     const int maxProperties = 252; // 255 less 3 system properties 
     const int maxPropertySize = 64 * 1024; // 64KB property size limit 

     var stream = new MemoryStream(new byte[512 * 1024]); // 0.5MB of data 
     var entity = new DynamicTableEntity("pk", "rk"); 
     var buffer = new byte[maxPropertySize]; 
     var keySize = (entity.PartitionKey.Length + entity.RowKey.Length) * 2; 
     var used = rowOverhead + keySize; 

     for (var i = 0; i < maxProperties + 1; i++) 
     { 
      if (i > maxProperties) 
      { 
       throw new ArgumentException(string.Format("You have exceeded the column limit of {0}.", maxProperties)); 
      } 

      var name = string.Concat("d", i); 
      var overhead = CalculatePropertyOverhead(name, EdmType.Binary); 
      var read = stream.Read(buffer, 0, maxPropertySize - overhead); 
      used += read + overhead; 

      if (used > maxRowSize) 
      { 
       throw new ArgumentException(string.Format("You have exceeded the max row size of {0} bytes.", maxRowSize)); 
      } 

      if (read > 0) 
      { 
       var data = new byte[read]; 
       Array.Copy(buffer, 0, data, 0, read); 
       entity.Properties.Add(name, new EntityProperty(data)); 
      } 
      else 
      { 
       break; 
      } 
     } 

     Console.WriteLine("Total entity size: {0}", used); 
     table.Execute(TableOperation.InsertOrReplace(entity)); 
    } 

    static int CalculatePropertyOverhead(string name, EdmType type) 
    { 
     const int propertyOverhead = 8; 
     int propertyNameSize = name.Length * 2; 
     int propertyTypeSize; 

     switch (type) 
     { 
      case EdmType.Binary: 
      case EdmType.Int32: 
      case EdmType.String: 
       propertyTypeSize = 4; 
       break; 
      case EdmType.Boolean: 
       propertyTypeSize = 1; 
       break; 
      case EdmType.DateTime: 
      case EdmType.Double: 
      case EdmType.Int64: 
       propertyTypeSize = 8; 
       break; 
      case EdmType.Guid: 
       propertyTypeSize = 16; 
       break; 
      default: 
       throw new NotSupportedException(); 
     } 

     return propertyOverhead + propertyNameSize + propertyTypeSize; 
    } 
} 

Każda pomoc w wyjaśnieniu tego, czego mi brakuje, jest doceniana!

Dzięki,

Mattias

Odpowiedz

4

Mattias, limity jesteś refering są dla rzeczywistej Storage Service, ale są kierowane lokalnego Emulator Storage. Emulator używa lokalnego serwera SQL jako swojego magazynu kopii zapasowych i ma inne ograniczenia niż faktyczna usługa przechowywania. Zobacz http://msdn.microsoft.com/en-us/library/windowsazure/gg433135.aspx uzyskać więcej informacji, w szczególności tej linii:

* The total size of a row in a table in the storage emulator is limited to less than 1 MB. 
+0

Dzięki, podejrzewałem, że tak dużo ale MSDN temat pomaga potwierdzeniu. –

+1

'mniej niż 1 MB' brzmi niejasno, po prostu ciekawi, jaki jest limit na emulatorze ... – JustAMartin

Powiązane problemy