やみくもに参加するよりも少し難しいと言って始めましょうbyte[]
。
私の全体像の目標は、現在多くの 512 バイトのページを Web サーバー (Azure ページ Blob) にアップロードしているアプリケーションを最適化し、それを 4 メガバイト以下の 1 回の大きなアップロードに減らすことです。理由の詳細については、この質問の下部にあるリンクを参照してください。
理由の簡単な答え: Azure スパース ファイルを使用することで、この最適化により速度が向上し (IO が少なくなり)、長期的にコストが節約されます。
詳細は次のとおりです。
クラスはする必要があります
alignment start
データを受け入れて保存します ( 、alignment stop
、および付随するペイロードとして定義された data .N個のデータが到着した後、または
event
発生した後、ProcessData()
. これは、境界に従ってデータを組み立てる時が来たことを意味します ( の終了値はblob1
の開始値と一致する必要がありますblob2
) 。連続するデータは、実際には順不同で到着する場合があります。
非連続データは、呼び出し元のアプリが発生する前にそれを送信しない場合として定義され
processData()
ます。さらに、512 バイトの範囲全体 == ゼロの場合、特別な処理が行われ、非連続として扱われます。byte[] の型を扱っているため、ここでは効率的なリストが複雑になる可能性があります。配列の不要なコピーや拡張は避けたいと思います。
わかる?(泥のように、そうでないことを願っています)
これまでで最も近いのは、メソッドの署名を書くことです:(私が知っているラメ)
// This can't be bigger than 4Mb, or smaller than 512
byte[] BigBlobToUpload = new byte[];
/// <summary>
/// Collects consecutive data ranges that will be uploaded
/// </summary>
/// <param name="NameOfTarget">The name of the target (unique per host)</param>
/// <param name="range">The data to be collected, in 512K multiples</param>
/// <param name="offsetToTransfer">The "start point" or offset of the data stored in range to be included. Almost always 0.</param>
/// <param name="sizeToTransfer">The length, or end of the range to include. Almost always 512.</param>
/// <param name="cloudOffset">The location this data should be placed in the BigBlobToUpload global var for eventual upload</param>
private void AddToQueue(string NameOfTarget, byte[] range, int offsetToTransfer, int sizeToTransfer, int cloudOffset)
{
}
これらのことを効率的に追跡する方法について誰かに指示してもらいたいだけです...私はそこからそれを処理できます。抽象的な方向性でも役に立ちます
どのように追跡し、条件付きで連続したデータ範囲に参加するべきかについて、誰かが私を正しい概念的な方向に導くことができますか?
言うまでもなく、必要に応じて配列を展開またはコピーするだけの効率的なロジックを作成しようとしています。