2017-12-04 21 views
1

Azure BLOBストレージを使用するためにバイナリファイルのタイプを読み取る既存のC#(ドットネットコア)アプリケーションを変更しています。Azure BLOBストレージからデータを読み取るときにOpenReadAsync()の奇妙な結果が返される

私はWindows.Azure.Storage(8.6.0)を使用しています。

このアプリケーションでは、ストリームからファイルのバイナリデータを非常に小さなブロック(5000〜6000バイトなど)で読み込むことが問題です。これは、データの構造を反映しています。

例の擬似コード:

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を使用して10メガバイトのファイルを読み込むしようとした場合()、私は周りの419万バイトの後にバイト配列内の無効/ジャンク値を取得します。

  • StreamMinimumReadSizeを100Mbに設定すると動作します。
  • ブロックごとにさらにデータを読み込むと(たとえば1MB)、それは機能します。

ファイルの中には100Mbを超えるものがある可能性があります。そのため、StreamMinimumReadSizeの設定が最適な解決策ではない場合があります。

ここでは何が起こっていますか、これをどのように修正できますか?

+1

まだt.Resultを呼び出す場合にOpenReadAsyncバージョンを使用していますか? – VitaliyK

+0

良い質問です。この記事で述べたように、私は.netコアと非同期呼び出しのみを持つWindows.Azure.Storageライブラリを使用しています。私は、コードは私が同期的に呼び出すことを決めたところからやってきたテストからのものだと思います。私はコード例を待って更新しましたが、明らかに私はまだ同じ問題を抱えています。 –

+0

OpenToAsyncの代わりにDownloadToStreamAsync blobメソッドも試しましたか? StreamMinimumReadSizeInBytesプロパティに他の値を指定しなかった場合の4MBは、blobダウンロードのデフォルトのブロックサイズです。 – VitaliyK

答えて

1

無効な/迷惑メールの値はゼロですか?もしそうなら(もしそうでなくても)、stream.Readから戻り値をチェックしてください。この方法では、実際に要求したバイト数を読み取ることが保証されていません。それはより少なく読むことができます。あなたが望む合計金額を読むまで、あなたはループでそれをもう一度呼び出すことになっています。クイックウェブ検索では、必要なループの例がたくさん表示されるはずです。

+0

これは問題でした。既存のアプリケーションはストリームから読み込みましたが、読み込んだバイト数が正しいことを確認していませんでした。 FileStreamでは問題は起きませんでしたが、Azure BlobとOpenReadAsync()を使って作業するとき、stream.Readから返された値をチェックする必要があることがすぐに分かりました。 –

関連する問題