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の設定が最適な解決策ではない場合があります。
ここでは何が起こっていますか、これをどのように修正できますか?
まだt.Resultを呼び出す場合にOpenReadAsyncバージョンを使用していますか? – VitaliyK
良い質問です。この記事で述べたように、私は.netコアと非同期呼び出しのみを持つWindows.Azure.Storageライブラリを使用しています。私は、コードは私が同期的に呼び出すことを決めたところからやってきたテストからのものだと思います。私はコード例を待って更新しましたが、明らかに私はまだ同じ問題を抱えています。 –
OpenToAsyncの代わりにDownloadToStreamAsync blobメソッドも試しましたか? StreamMinimumReadSizeInBytesプロパティに他の値を指定しなかった場合の4MBは、blobダウンロードのデフォルトのブロックサイズです。 – VitaliyK