私は効果的にログデータを含むページブロブを持っています。ログが過去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
コードが正しく動作しています。私は、ブロブからチャンクを読み込み、そのストリームを使用してストリームを独自に実装してみましたが、すべてが問題ありません。 OpenReadAsyncストリームを使用して私のために動作しません。私は一度にすべてのバイトを読んでいないので、歩留まりが問題を引き起こしているのだろうかと思います。 – MPavlak
また、すべてのオブジェクトが同じサイズで、読み込みに問題はありません。それは2MB境界でのみです。そのオブジェクトは境界を越えて存在します。 read呼び出しは期待されるバイト数よりも少ないバイト数を返しますが、その2MBのバッファーの後にはさらに多くのバイトがあります。 – MPavlak
pageAlignedEventStreamをフェッチするために使用しているコードを教えてください。 –