从Azure Blob存储中读取数据时,OpenReadAsync()产生奇怪的结果

时间:2017-12-04 15:37:08

标签: c# azure azure-storage-blobs

我正在修改现有的C#(点网核)应用程序,该应用程序读取一种二进制文件以使用Azure Blob存储。

我正在使用Windows.Azure.Storage(8.6.0)。

问题是该应用程序以非常小的块(例如5000-6000字节)从Stream中读取文件中的二进制数据。这反映了数据的结构。

伪代码示例:

var blocks = new List<byte[]>(); 
var numberOfBytesToRead = 6240;
var numberOfBlocksToRead = 1700;

using (var stream = await blob.OpenReadAsync())
{
  stream.Seek(3000, SeekOrigin.Begin); // start reading at a particular position
  for (int i = 1; i <= numberOfBlocksToRead; i++)
  {
    byte[] traceValues = new byte[numberOfBytesToRead];
    stream.Read(traceValues, 0, numberOfBytesToRead);
    blocks.Add(traceValues);
  }
}`

如果我尝试使用OpenReadAsync()读取10mb文件,则在大约4,190,000字节后,我会在字节数组中获得无效/垃圾值。

  • 如果我将StreamMinimumReadSize设置为100Mb就可以了。
  • 如果我每个块读取更多数据(例如1mb),它就可以工作。

某些文件可能超过100Mb,因此设置StreamMinimumReadSize可能不是最佳解决方案。

这里发生了什么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

无效/垃圾值是零吗?如果是这样(甚至可能),请检查stream.Read中的返回值。该方法无法保证实际读取您要求的字节数。它可以阅读更少。在这种情况下,您应该在循环中再次调用它,直到它已读取您想要的总量。快速网络搜索应该向您展示许多必要循环的示例。