de la biblioteca estándar de C poseen un buffer interno, por lo que los
accesos a disco probablemente sea muy poco aún cuando se obtienen uno a
uno.
+\layout Section
+
+Conclusiones
+\layout Standard
+
+Luego de terminar con todo los requerimientos del TP, inclusive aquellos
+ que solo nos hicieron retrasar con tareas mas importantes (como se la posibilid
+ad de imprimir a un archivo un reporte) nos pusimos a tratar de realizar
+ las comparaciones entre los distintos indices y los tipos de archivo.
+ En un primer momento se trato de hacerse midiendo tiempos, pero al no poseer
+ ANSI C funciones de tiempo con suficiente presicion no se pudo obtener
+ ninguna conclusión relevante.
+\layout Standard
+
+Fue entonces que desidimos hacer una comparativa basada en el uso del programa
+ modificando los parametros de carga.
+ Lo que hicimos fue para cada archivo (articulos y facturas) probar utilizar
+ la clave primaria con los tres tipos de arboles y luego navegar por los
+ menues del programa realizando operaciones de consultas, busquedas, etc
+ a fin de ver si se notaba diferencia.
+ Este útimo análisis no es del todo objetivo, pero nos dio pié para realizar
+ una charla por IRC donde discutimos nuestra experiencia con cada tipo de
+ índice.
+\layout Standard
+
+La conclusión a que llegamos es que para el archivo de artículos, que es
+ de tipo maestro (pues es un archivo que tiene pocas altas y muchas consultas)
+ sería preference utilizar un índice primario de tipo B+ ya que nos permite
+ acceder de manera ordenada de 2 maneras, mediante el índice y tener un
+ acceso secuencial (ideal para hacer un reporte por ejemplo), y dado que
+ los artículos permanecerán ordenados los reportes saldrán de la misma manera.
+\layout Standard
+
+En cambio para las facturas sería mejor tener un índice B o B*, ya que es
+ un archivo de transacciónes, donde se suponen que las altas son mayores
+ que las consultas (esperamos poder vender mucho!).
+ La ventaja del B y B* es que la inserción es más simple, requiere de un
+ menor movimiento de registros a la hora de agregar, ya que no es necesario
+ que en el archivo de datos estos queden ordenados, pudiendo quedar en cualquier
+ orden fisicamente, aún estando en el mismo bloque.
+ Esta forma de organizarla obviamente no es para nada útil si necesitaramos
+ por alguna razón acceder secuencialmente por clave primaria, ya que deberiamos
+ estar saltando por todo el archivo para poder hacerlo.
+\layout Standard
+
+No hemos encontrado muchas razones para decidirnos por B o B*, y que nuestra
+ implementacion es la misma salvando por el insertar, que en el caso del
+ B* hace todas las rotaciones posibles antes de hacer un split, cosa que
+ puede veneficiar ya que la creacion de nodos es menor, pero para las cantidades
+ de datos manejados no vemos que influya mucho.
\the_end
{
FILE *fp;
char *out;
- /*B_NodoHeader header;
- B_NodoEntry *claves;*/
+ B_NodoHeader header;
+ B_NodoEntry *claves;
if (id < 0) return NULL;
}
/* Si estoy manejando string tengo que sacar las abreviaturas */
-/* if (idx->tipo_dato == IDX_STRING) {
+ if (idx->tipo_dato == IDX_STRING) {
b_leer_header(out, &header);
claves = b_leer_claves(out, &header);
desabreviar_claves(idx, claves, &header);
- }*/
+ }
fclose(fp);
return out;
}
static void b_grabar_nodo(INDICE *idx, int id, char *data)
{
FILE *fp;
- /*B_NodoHeader header;
- B_NodoEntry *claves;*/
+ B_NodoHeader header;
+ B_NodoEntry *claves;
/* Si las claves son de tipo string debo abreviar antes de guardar */
-/* if (idx->tipo_dato == IDX_STRING) {
+ if (idx->tipo_dato == IDX_STRING) {
b_leer_header(data, &header);
claves = b_leer_claves(data, &header);
abreviar_claves(idx, claves, &header);
- }*/
+ }
fp = fopen(idx->filename, "r+");
fseek(fp, id*idx->tam_bloque, SEEK_SET);
fwrite(data, 1, idx->tam_bloque, fp);