Как отследить отдельные объекты, которые вышли из строя, а затем соединить () последовательные объекты? - PullRequest
2 голосов
/ 13 октября 2011

Я начну с того, что скажу, что это будет немного сложнее, чем слепо соединить 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)
{

}

Мне просто нужен кто-то, чтобы дать мне указание о том, как эффективно отслеживать эти вещи ... Я могу справиться с этим оттуда. Даже абстрактное направление поможет

Может ли кто-нибудь указать мне правильное концептуальное направление того, как я должен отслеживать, а условно объединять последовательные диапазоны данных?

Не говоря уже о том, что я пытаюсь использовать эффективную логику, которая только расширяет или копирует массив при необходимости.

...