我有一个包含有效日志数据的页面blob。一切正常,直到日志填满2 MB。
在阅读时,我正在使用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时,会发生故障。在返回之前,读取无法提取额外的字节,只读取503个字节而不是预期的3575个字节。
我的期望是,当我读过缓冲区大小时,会下载更多数据。
我在Azure Feedback上发现了一个类似的问题,但链接问题表明非2次幂缓存,但2MB肯定是2的幂。
答案 0 :(得分:0)
即使我将CloudPageBlob的StreamMinimumReadSizeInBytes property设置为2MB,我也可以获取存储在页面blob中的所有数据(大小= 3MB)。
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 变量的变化,并检查代码逻辑是否符合预期。