Optimizaciones para obtener los contextos


La aplicación de Buscaplus que va a salir en unos días utiliza django. Organizamos todo el texto de las páginas web en contextos desde ficheros XML.

Estos contextos nos permiten obtener datos de:

  • Mensajes y textos comunes a todos los casos de uso
  • Mensajes y textos de un caso de uso determinado
  • Mensajes y textos de contextos asociados a un caso de uso
  • Textos de las combos, tablas de referencia (id->literal), etc…

Utilizamos tablas BerkeleyDB no relacional que para actividades id->valor es muy eficiente, además de que permite tener parte de la información en memoria y el resto en disco, o tenerla toda en memoria. En este caso debido a que todas estas tablas de referencia de contextos no ocupará mucho, estará todo en memoria. Lo que se ha utlizado se ha visto que ocupa muchas lineas de código y puede tener varias llamadas al servidor dbmd (BerkeleyDB):

?View Code PYTHON
	XmlContentList = util.content.getXmlList('xml_content', 'main.db', ['Index/' + sLang, 'Profile/' + sLang, 'Messages/' + sLang])
	BaseXml = util.xml_lib.PageXML()
	BaseXml.parse(XmlContentList[0])
	BaseContextDict = BaseXml.getContainerDict('DICT_BASE_CONTEXT')
	ContentXml = util.xml_lib.PageXML()
	ContentXml.parse(XmlContentList[1])
	TextDict = ContentXml.getContainerDict('DICT_TEXT')
	MessagesXml = util.xml_lib.PageXML()
	MessagesXml.parse(XmlContentList[2])
	MessagesDict = MessagesXml.getContainerDict('DICT_MESSAGES')
	xmlTables = util.content.getXml('xml_web', 'tables.db', 'Main/' + sLang)
	TableXml = util.xml_lib.PageXML()
	TableXml.parse(xmlTables)
	CountryDict = TableXml.getContainerDict('DICT_COUNTRY')


getXmlList obtiene desde un entorno y una tabla varios contextos. Despues de esto se parsea el resultado y se convierte los datos en un diccionario. Los XML de los contextos tienen el formato:

<?xml version="1.0" encoding="UTF-8"?>
<pageXML>
	<container id="DICT_CONTENT_TYPE">
		<key name="text/xml">XML</key>
		<key name="text/vnd.wap.wml">WML</key>
		<key name="application/pdf">PDF</key>
		<key name="application/msword">DOC</key>
        </container>
</pageXML>

Como se ve los ficheros XML todos tienen la forma key name -> key value.

En los futuros desarrollos se utilizarán esta otra forma, con menos líneas de código:

?View Code PYTHON
	ContextData = {}
	ContextData[('xml_content', 'main.db')] = [('Index/' + sLang,'DICT_BASE_CONTEXT'), ('Profile/' + sLang, 'DICT_TEXT'), ('Messages/' + sLang, 'DICT_MESSAGES')]
	ContextData[('xml_web', 'tables.db')] = [('Main/' + sLang, 'DICT_COUNTRY')]
	BaseContextDict, TextDict, MessagesDict, CountryDict, util.context.getContextsList(ContextData)

Sólo habrá que rellenar un diccionario ContextData con la información de los entornos, tablas y contextos a devolver. Habrá que incluir un método en el servidor dbmd para que obtenga una lista de valores de distintas tablas. En la actualidad sólo devuelve una lista de valores de una misma tabla y entorno.

Parece que de esta forma cada petición a una página web o llamada AJAX utilizará una llamada al servidor teniendo los datos en memoria por lo que será muy rápido. Y parece que será mucho más simple de codificar, ¿no?

  • Jorge

    Se han hecho unos cambios.

    Ahora en vez de enviar un diccionario se envía una lista, ya que un diccionario no respeta el orden de los elementos:

    ?View Code PYTHON
    ContextDataList = []
    ContextDataList.append([('xml_web', 'tables.db'), [('SearchAccounts/' + sLang,'DICT_LICENSE_TYPES'), ('Main/' + sLang, 'DICT_MONTHS')]])
    ContextDataList.append([('xml_web', 'messages.db'), [('Account_Change_License/' + sLang, 'DICT_EMAIL')]])
    LicenseTypeDict, MonthDict, MessageDict = util.content.getContextsList(ContextDataList)