\subsubsection{Política de borrado de caché}

Las cachés de teselas pueden llegar a contener gran cantidad de información y esta debe ser controlada debidamente para no exceder la capacidad de almacenamiento. Una de las características de las que se ha dotado al sistema es la de limitar el tamaño ocupado en disco, con la propiedad de configurar este valor desde un panel de usuario. Cuando se excede esa capacidad fijada aparece el problema de borrado de datos. Hay que decidir que datos se borran, cuantos y en que orden. Este problema no es trivial teniendo en cuenta que cada capa puede tener una cantidad muy variable de información guardada y que el borrado de una capa completa puede liberar desde unos pocos kB hasta algunos gigas, no conociendo esta información a priori. Por lo tanto parece que la capa no es una unidad de borrado óptima, es decir cuando queremos liberar información eliminar una capa no asegura dejar espacio libre o es posible que se esté borrando información útil. 

Para solucionar este problema se diseña una estrategia de borrado que no borre más información de la necesaria, no consuma muchos recursos y elimine la información menos útil dejando la mejor.

Para el control de la ocupación en disco se dota al sistema de un actualizador de tamaño ocupado en caché donde cada vez que se descargan datos son sumados a los que ya hay teniendo este valor actualizado constantemente. De esta forma no es necesario tener ningún proceso pesado para el calculo de ocupación en disco cada cierto tiempo. Con este sistema se es capaz en cualquier momento de saber cuando excedemos el volumen configurado. 

Se considera el nivel de resolución como unidad óptima de borrado por evitar los problemas descritos en capas completas. Por otro lado el eliminar teselas sueltas aparece extremadamente ineficiente debido a la gran cantidad de estos y a la imposibilidad de llevar control para cada uno de su control de acceso.

Para decidir los niveles que deben ser eliminados se propone un sistema de control de acceso a lectura. Es decir, para cada nivel de resolución de cada capa se guarda en un mapa de valores con el instante de tiempo en el que fueron accedidos. Este valor de antigüedad define que niveles se borrarán antes y que niveles tardarán más en eliminarse. Al poner en marcha el proceso de borrado se borrarán por orden de antigüedad.

La política de borrado de datos de la caché puede concretarse en los siguientes algoritmos

\begin{algorithm}
\caption{Acceso a tile (Actualizar variable de tiempo en cada consulta)}
\label{tileaccess}
\begin{algorithmic}
\FOR{$i$ = 0 to $LayerList.size()$}
	\FOR{$j$ = 0 to $ResolutionLevelList.size()$}
		\STATE $SetTime(ResolutionLevelList_{i})$
	\ENDFOR
\ENDFOR
\end{algorithmic}
\end{algorithm}

\begin{algorithm}
\caption{Descarga de tile o conjunto de estos (Si se excede el tamaño de caché se ha de decidir las acciones)}
\label{requesttiles}
\begin{algorithmic}
\IF{$MaxSizeCacheExceded()$}
	\STATE $ShowOptions()$
		\STATE $Option1 \Rightarrow CleanOldest()$
		\STATE $Option2 \Rightarrow IncreaseCacheSize()$
\ENDIF
\end{algorithmic}
\end{algorithm}

\begin{algorithm}
\caption{Eliminar datos más antiguos (CleanOldest)}
\label{cleanoldest}
\begin{algorithmic}
\STATE $Order(ResolutionLevelList)$
\WHILE{$MaxSizeCacheExceded()$}
	\STATE $Remove(ResolutionLevelList_{i})$
	\STATE $UpdateCacheSize()$
\ENDWHILE
\end{algorithmic}
\end{algorithm}
