close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Last modified 14 years ago

#1070 new task

Conjuntos versus Almacenes de datos

Reported by: Víctor de Buen Remiro Owned by: Víctor de Buen Remiro
Priority: low Milestone: Mantainance
Component: SetAlgebra Version:
Severity: minor Keywords:
Cc:

Description (last modified by Víctor de Buen Remiro)

Los conjuntos en TOL representados por el tipo "Set" son internamente un array de punteros a objetos TOL con algo más de overhead para el manejo de Struct, NameBlock y otros temas.

Esta representación exhaustiva es muy flexible y potente pero unida a la gran cantidad de información adjunta a todo objeto TOL produce un gran aumento del tamaño de la memoria cuando se manejan conjuntos grandes.

Para ciertos tipos de conjuntos que se utilizan muy a menudo podría pensarse en un método de representación interna más eficiente. Por ejemplo, un conjunto que sólo tuviera números sería mucho más eficaz almacenarlo como un vector de elementos de tipo double. No existiría un objeto TOL para cada elemento sino que sólo cuando se accediera al mismo se crearía el objeto Real con el valor correspondiente.

Evidentemente esto tiene un precio, pues no sería posible acceder por nombre a un conjunto como éste, ni tampoco podría añadírsele con Append algo que no fuera un número. Está claro que se necesita algo más flexible y potente que un mero array.

En lugar de número podría albergar textos, fechas, matrices o cualquier tipo TOL no abstracto, pero nunca podría albergar una serie temporal infinita, un conjunto temporal, una función, ni un NameBlock. Estos tipos abstractos quizás se podrían almacenar como expresiones evaluables. El problema de estos tipos de datos es que no son autodefinidos, sino que requieren referencias a otros objetos creados previamente, por lo que no se pueden consultar ni modificar de forma aleatoria sino únicamente en un hilo secuencial.

Tratar de extender el actual tipo Set a estos conceptos tal vez resultase demasiado complicado, aunque aún no se debe descartar, debido a las restricciones de las operaciones realizables, por lo que quizás sería más sensato crear un nuevo tipo Data que podría albergar sólo elementos de tipos no abstractos incluido el propio Data.

También cabe la posibilidad de no implementar un nuevo tipo sino que sea sólo una API, un conjunto de métodos que permitan manejar la información de una forma eficaz y sencilla de manejar y que los almacenes se identifiquen mediante un puntero interno visible en TOL como un Real igual que se hace ahora con los archivos Excel y otros sistemas.

En cualquier caso llamaremos Data al sistema que implemente estas ideas, y ya se verá después el formato. Este nuevo sistema sería en sí mismo una forma de serialización y tendría una enorme utilidad como puente para el manejo masivo de información en

  • memoria: Debe ser tan fácil de usar como lo es el Set actualmente, tanto en creación como en consulta y modificación.
  • archivos: Debe ser almacenable y legible a y desde disco de una forma natural. Este es el método de almacenamiento persistente más sencillo y más adecuado a un entorno local.
  • bases de datos: Debe ser insertable en un campo blob de una base de datos remota. Se trata de un método de almacenamiento persistente más complicado que el archivo pero mucho más seguro y fácil de usar en un entorno de desarrollo compartido. Sólo es necesario implementar en TOL un mecanismo para inserción y lectura de datos blob, ay que actualmente esto sólo se puede hace mediante codificación en Base64.
  • comunicaciones: Debe ser transmisible vía tcpip al menos entre procesos TOL, pero no estaría de más que otros procesos fueran capaces de crearlos o entenderlos.

Habría que considerar la posibilidad de que el método de almacenamiento de este tipo de datos, o al menos uno de los métodos, fuera Sqlite embebido en C++, pues esto permitiría abstraerse de toda la complejidad del almacenamiento, altas, bajas y modificaciones del contenido. Sqlite es una base de datos que se almacena en un único fichero por lo que es ideal para los objetivos planteados. Cada objeto de tipo Data podría implementarse como una base de datos [en memoria que podría salvarse en disco en cualquier momento.

En cuanto a la estructura de los objetos dentro del Data podrían plantearse varios tipos que dieran la mayor flexibilidad:

  • Table: Cuando los datos que se quieren almacenar son simplemente registros estructurados de forma homogénea, es decir, cada elemento es un a su vez un Data con una estructura fija, el objeto puede ser almacenados como una simple tabla sin más.
  • Tree: Si los datos se organizan de forma arbitraria es necesario tener una tabla de objetos y otra de relaciones de pertenencias. En la primera habría un campo identificador numérico, otro de nombre, un indicador del tipo TOL y otro campo de contenido sin tipo SQL prefijado, una característica interesante de Sqlite Manifest typing, que permite asignar un tipo distinto a cada valor.

Change History (6)

comment:1 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)

comment:2 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)
Summary: Conjuntos versus VectoresConjuntos versus Almacenes de datos

comment:3 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)

comment:4 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)

comment:5 Changed 14 years ago by Víctor de Buen Remiro

Description: modified (diff)

comment:6 Changed 14 years ago by Víctor de Buen Remiro

Priority: highlow
Severity: blockerminor
Note: See TracTickets for help on using tickets.