1. Необходимо реализовать механизм индексации кеша, позволяющий быстро (желательно без обращений к файловой системе) определять есть ли в кеше тот или иной тайл.
Вариант реализации:
- - Индексная структура должна представлять собой набор вложенных списков прямоугольников и относиться к кешу определённого уровня Z=1..24.
- Координаты прямоугольников соответствуют номерам тайлов.
- Прямоугольники могут быть негативными, позитивными, либо бинарными.
- * Тайл с координатами, принадлежащими негативному прямоугольнику и не принадлежащими его дочерним прямоугольникам, считается отсутствующим в кеше.
* Тайл с координатами, принадлежащими позитивному прямоугольнику и не принадлежащими его дочерним прямоугольникам, считается присутствующим в кеше.
* Бинарный прямоугольник содержит (Width * Height) бит данных, где каждый бит определяет наличие или отсутствие соответствующего ему тайла в кеше.
- Любой небинарный прямоугольник четного уровня вложенности -- негативный.
- Любой небинарный прямоугольник нечетного уровня вложенности -- позитивный.
Таким образом можно в малом объёме данных хранить информацию о закачанных тайлах и иметь быстрый доступ к этой информации.
Более того, на основе двух таких индексных структур для репликации можно подготовить список файлов, имеющихся в одном кеше и отсутствующих в другом.
Остаётся реализовать алгоритмы добавления тайла, удаления тайла, быстрого слияния и вычитания индексных структур, оптимизации индексной структуры.
Следить за целостностью индексаного файла можно несколькими способами:
- - посредством программы, закачивающей тайлы в кеш;
- посредством обработки события от файловой системы на добавление\удаление файла;
- можно формировать индекс заново.
2. Имея вышеописанный механизм индексирования, можно локально завести несколько индексных структур и с их помощью определять в каком конкретно кеше лежит необходимый нам тайл.
3. Такой механизм индексирования позволит также определять для каждого кеша маску, по которой в него будут сохранятся тайлы. То есть можно завести несколько кешей (общий, Город1, Город2, город3 и т.д.) и в каждый кеш тайл будет сохраняться только в случае соответствия маске данного кеша. Таким образом можно легко делиться кешами тайлов отдельных городов. При этом сами маски будут занимать буквально несколько десятков байт и определение принадлежности им тайла будет происходить мгновенно (простая проверка принадлежности точки списку прямоугольников).
4. Карта покрытия региона тайлами i-го уровня будет строиться так же быстро. Достаточно обойти в ширину всё индексное дерево и отобразить позитивно или негативно все прямоугольники.
У кого есть какие соображения относительно алгоритмов добавления и оптимизации?