2016-11-20 5 views
0

私は効果的にログデータを含むページブロブを持っています。ログが過去2 MBまでいっぱいになるまで、すべてうまく動作します。Azure Page Blob OpenReadはStreamMinimumReadSizeInBytesより多くをフェッチしません

読み込み時に、OpenReadAsyncメソッドを使用して、データを読み取るストリームを取得しています。 OpenReadAsyncを呼び出す前に、StreamMinimumReadSizeInBytesを2MB(2 * 1024 * 1024)に設定しました。

ストリームを開いた後、次の方法でデータを読み込みます。

public IEnumerable<object> Read(Stream pageAlignedEventStream, long? maxBytes = null) 
    { 
     while (pageAlignedEventStream.Position < (maxBytes ?? pageAlignedEventStream.Length)) 
     { 
      byte[] bytesToReadBuffer = new byte[LongZero.Length]; 
      pageAlignedEventStream.Read(bytesToReadBuffer, 0, LongZero.Length); 
      long bytesToRead = BitConverter.ToInt64(bytesToReadBuffer, 0); 

      if (bytesToRead == 0) 
      { 
       yield break; 
      } 

      if (bytesToRead < 0) 
      { 
       throw new InvalidOperationException("Invalid size specification. Stream may be corrupted."); 
      } 

      if (bytesToRead > Int32.MaxValue) 
      { 
       throw new InvalidOperationException("Payload size is too large."); 
      } 

      byte[] payload = new byte[bytesToRead];     
      int read = pageAlignedEventStream.Read(payload, 0, (int) bytesToRead); 

      if (read != bytesToRead) 
      { 
       // when fails, read == 503, bytesToRead = 3575, position = 2MB (2*1024*14024) 
       throw new InvalidOperationException("Did not read expected number of bytes."); 
      } 

      yield return this.EventSerializer.DeserializeFromStream(new MemoryStream(payload, false)); 

      var paddedSpaceToSkip = PagesRequired(bytesToRead) * PageSizeBytes - bytesToRead - LongZero.Length; 
      pageAlignedEventStream.Position += paddedSpaceToSkip; 
     } 

     yield break; 
    } 

コード内のコメントに記載されているように、位置が指定された2MBに達すると、エラーが発生します。読み込みは、返される前に追加のバイトを引き出すことに失敗し、予想される3575バイトの代わりに503バイトしか読み込みません。

私は、バッファサイズを過ぎて読んだときに、より多くのデータをダウンロードすると予想していました。

私は私が保存されていること、すべてのデータ(サイズ= 3メガバイト)をフェッチすることができAzure Feedbackに同様の問題が、リンクされ問題は非電源-の-2 BUFFERSIZEを示したが2メガバイトは間違いなく2

答えて

0

の力で発見私がCloudPageBlobのStreamMinimumReadSizeInBytes propertyを2MBに設定したにもかかわらず、ページブロブで

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        CloudConfigurationManager.GetSetting("StorageConnectionString")); 

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

CloudBlobContainer container = blobClient.GetContainerReference("mycontainername"); 

container.CreateIfNotExists(); 

CloudPageBlob pageBlob = container.GetPageBlobReference("mypageblob"); 

pageBlob.StreamMinimumReadSizeInBytes = 2 * 1024 * 1024; 

Task<Stream> pageAlignedEventStream = pageBlob.OpenReadAsync(); 

読み取りが復帰する前に、追加のバイトを引っ張るために失敗し、唯一の503バイトの代わりに、予想される3575のバイトを読み取ります。

この数多くのバイトが現在利用できず、ストリームの終わりに達している場合、返される値は要求されたバイト数よりも少なくなる可能性があります。変数の変更をトレースするようにコードをデバッグしてpaddedSpaceToSkipとし、コードロジックが期待どおりであるかどうかを確認してください。

+0

コードが正しく動作しています。私は、ブロブからチャンクを読み込み、そのストリームを使用してストリームを独自に実装してみましたが、すべてが問題ありません。 OpenReadAsyncストリームを使用して私のために動作しません。私は一度にすべてのバイトを読んでいないので、歩留まりが問題を引き起こしているのだろうかと思います。 – MPavlak

+0

また、すべてのオブジェクトが同じサイズで、読み込みに問題はありません。それは2MB境界でのみです。そのオブジェクトは境界を越えて存在します。 read呼び出しは期待されるバイト数よりも少ないバイト数を返しますが、その2MBのバッファーの後にはさらに多くのバイトがあります。 – MPavlak

+0

pageAlignedEventStreamをフェッチするために使用しているコードを教えてください。 –

関連する問題