Я начну с того, что скажу, что это будет немного сложнее, чем слепо соединить byte[]
вместе.
Моя общая задача состоит в том, чтобы оптимизировать приложение, которое в настоящее время загружает много 512-байтовых страниц на веб-сервер (блоб страницы Azure), и уменьшить это до одной большой загрузки 4Megs или меньше. См. Ссылки внизу этого вопроса для получения дополнительной информации о том, почему.
Краткий ответ на вопрос: эта оптимизация увеличит скорость (меньше операций ввода-вывода) и сэкономит деньги в долгосрочной перспективе, используя разреженные файлы Azure
Теперь для деталей:
Класс должен будет
Примите данные и сохраните их (данные определены как alignment start
, alignment stop
и сопутствующая полезная нагрузка.
После получения N фрагментов данных или event
, ProcessData()
. Это означает, что пришло время собирать данные в соответствии с границами (конечное значение blob1
должно совпадать с начальным значением blob2
)
Последовательные данные могут фактически поступать не по порядку.
Непоследовательные данные определяются, когда вызывающее приложение не отправляет их до наступления processData()
. Кроме того, если весь 512-байтовый диапазон == ноль, то это получает специальную раздачу и рассматривается как непоследовательный.
Мы имеем дело с типами байтов [], поэтому эффективные списки здесь могут быть сложными. Я хотел бы избежать ненужных копий и расширений массива.
Имеет смысл? (как грязь, я надеюсь, что нет)
Самое близкое, что я до сих пор написал, - это написание сигнатуры метода: (Хм, я знаю)
// 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)
{
}
Мне просто нужен кто-то, чтобы дать мне указание о том, как эффективно отслеживать эти вещи ... Я могу справиться с этим оттуда. Даже абстрактное направление поможет
Может ли кто-нибудь указать мне правильное концептуальное направление того, как я должен
отслеживать, а условно объединять последовательные диапазоны данных?
Не говоря уже о том, что я пытаюсь использовать эффективную логику, которая только расширяет или копирует массив при необходимости.