(Optimización para textos detallada posteriormente)
\layout Section
+Compilación
+\layout Standard
+
+Para compilar es necesario el programa
+\family typewriter
+make
+\family default
+ (además de un compilador, por supuesto, para desarrollar utilizamos
+\family typewriter
+gcc
+\family default
+ 3.3.x).
+ Sólo hay que correr en el directorio
+\family typewriter
+src/
+\family default
+:
+\layout LyX-Code
+
+make depend
+\layout LyX-Code
+
+make
+\layout Standard
+
+El
+\family typewriter
+make depend
+\family default
+ utiliza la herramienta
+\family typewriter
+makedepend
+\family default
+ que analiza los archivos fuentes
+\family typewriter
+.c
+\family default
+ y busca sus dependencias con archivos
+\family typewriter
+.h
+\family default
+ observando la directiva
+\family typewriter
+#include
+\family default
+.
+ De esta manera se simplifica el mantenimiento del
+\family typewriter
+Makefile
+\family default
+.
+\layout Standard
+
+El
+\family typewriter
+make
+\family default
+ se encarga de la compilación en sí.
+\layout Section
+
Modo de uso
\layout Standard
Antes de pasar a su descripción, notamos la invocación general para comprimir
y descomprimir un archivo como se pidió en el enunciado
\begin_inset Foot
-collapsed true
+collapsed false
\layout Standard
-t
\family default
opcional que permite generar un archivo comprimido multivolumen, donde
- volsize será el tamaño en kbytes de cada volúmen, excepto el último que
+ volsize será el tamaño en kbytes de cada volumen, excepto el último que
podrá ser menor.
\layout Subsection
Opciones adicionales
\layout Standard
-Ademas de los flags standards que hemos visto recién, nuestro compresor
- cuenta con otra serie de ellos para la utilización de los features especiales
+Además de los flags estándar que hemos visto recién, nuestro compresor cuenta
+ con otra serie de ellos para la utilización de los características especiales
que veremos más adelante.
A fines de documentar la totalidad de los flags de ejecución, detallamos
los anteriores y los adicionales a continuación:
\family typewriter
-c
\family default
- Indica que se desea comprimir un archivo (mutualmente exclusivo con
+ Indica que se desea comprimir un archivo (mutuamente exclusivo con
\family typewriter
-d
\family default
\family typewriter
-d
\family default
- Indica que se desea descomprimir un archivo (mutualmente exclusivo con
-
+ Indica que se desea descomprimir un archivo (mutuamente exclusivo con
\family typewriter
-c
\family default
\labelwidthstring 00.00.0000
+\family typewriter
+-r
+\family default
+ Puede ser utilizado únicamente en una compresión y activa el característica
+ de
+\series bold
+Word Scaping
+\series default
+, que realizar un reemplazo de palabras frecuentes antes del BlockSorting.
+\layout List
+\labelwidthstring 00.00.0000
+
+
\family typewriter
-s
\family default
Especifica la calidad (nivel) de compresión.
Puede ser un valor entre 0 y 9, siendo 0 el menor nivel de compresión (más
rápido) y 9 el máximo (más lento).
- Por omisión se utiliza un nivel de compresión 5.
+ Por omisión se utiliza un nivel de compresión 5
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+Cada valor de este parámetro está asociado a un tamaño de página usado para
+ el algoritmo de
+\series bold
+Block Sorting
+\series default
+.
+ Los tamaños de página en bytes son, de 0 a 9 respectivamente: 1K, 2K, 4K,
+ 8K, 16K, 32K, 64K, 128K, 256K y 512K.
+\end_inset
+
+.
\layout Subsubsection*
Ejemplos
El otro problema es el tiempo de ordenamiento de los desplazamientos, que
debe ser lo menor posible.
- Una posibiliad es utilizar un método de ordenamiento de bajo órden, como
+ Una posibilidad es utilizar un método de ordenamiento de bajo orden, como
el Quick Sort
\begin_inset Foot
collapsed true
\layout LyX-Code
-Salida: 00001011001000200020101000300010004
+Salida: 000010110010000200020101000300001000
\layout Standard
Un símbolo es codificado como el índice (ó posición) en la lista de símbolos
compresor.
Antes, es necesario comentar que el estado del compresor, se mantiene a
través de una estructura definida como
-\series bold
+\family typewriter
HUFF_STATE
-\series default
-, en la cual se especificarán cosas tales como si el compresor actua sobre
- archivos o chunks de datos, si es un huffman canonico o standard, archivo
+\family default
+, en la cual se especificarán cosas tales como si el compresor actúa sobre
+ archivos o chunks de datos, si es un huffman canónico o estándar, archivo
a comprimir, archivo destino, etc.
\layout Paragraph
\family typewriter
-\noun on
HUFF_STATE *shuff_init_encoder_byfile(char *inputfile, char *outputfile,
long volsize);
\layout Itemize
\family typewriter
-\noun on
HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize);
\layout Itemize
\family typewriter
-\noun on
HUFF_STATE *shuff_init_decoder(char *inputfile, char *outputfile);
\layout Itemize
\family typewriter
-\noun on
void shuff_deinit_encoder(HUFF_STATE *shuff);
\layout Itemize
\family typewriter
-\noun on
void shuff_deinit_decoder(HUFF_STATE *shuff);
\layout Standard
\series medium
A fines de poder grabar o cargar un modelo de orden-0 el cual simplemente
- consiste en una tabla de frecuencias/probabilidades de los 255 symbolos
+ consiste en una tabla de frecuencias/probabilidades de los 255 símbolos
posibles en un archivo, dando lugar al Huffman Canónico que será explicado
posteriormente, se cuenta con dos funciones:
\family typewriter
, y
\family typewriter
shuff_load_model()
+\layout Subsection
+
+Virtual File
+\layout Standard
+
+Uno de los problemas que teníamos al principio era que las tareas estaban
+ mezcladas, entonces donde se estaba comprimiendo, se estaba guardando también
+ en un archivo y manejando la lógica de hacer los splits de los archivos.
+\layout Standard
+
+Obviamente como eso resultaba muy molesto planteamos un modelo más abstracto
+ al que llamamos
+\emph on
+Virtual File
+\emph default
+, que es una API escrita sobre la API ANSI-C de Input/Output que maneja
+ de manera transparente este tema.
+\layout Standard
+
+Utilizar la API esta tan simple como agregar una
+\begin_inset Quotes eld
+\end_inset
+
+v
+\begin_inset Quotes erd
+\end_inset
+
+ delante de las funciones
+\family typewriter
+fopen
+\family default
+,
+\family typewriter
+fclose
+\family default
+,
+\family typewriter
+fread
+\family default
+, etc y reemplazar la estructura
+\family typewriter
+FILE
+\family default
+ por
+\family typewriter
+VFILE
+\family default
+.
+\layout Standard
+
+Cuando se abre un archivo para escritura a medida que se van escribiendo
+ bytes se va incrementando un contador.
+ Si el contador llega al limite pedido, se cierra el archivo actual, se
+ abre el siguiente y se sigue escribiendo en éste, de manera totalmente
+ transparente para el usuario/programador.
+\layout Standard
+
+La lectura es similar.
+ Cada vez que se llega al EOF de un archivo, si éste no es el último volumen,
+ se cierra el archivo actual y se abre el siguiente hasta llegar al EOF
+ del último volumen.
+\layout Standard
+
+Esta API sólo agrega un byte de información de control delante de cada volumen,
+ que indica si es el último volumen del archivo virtual.
+ De esta manera se pueden abrir y leer archivos virtuales sin saber a priori
+ el tamaño de los volúmenes (hasta se podría ampliar la API de escritura
+ para que cada volumen tenga un tamaño distinto y la API de lectura seguiría
+ funcionando sin cambios).
\layout Section
vez superan los 50 ceros seguidos, por lo que de utilizar más de un byte
para expresar la cantidad de ceros que siguen al primero se obtendrían
peores resultados.
+\layout Standard
+
+Con respecto a los tiempos, como se puede observar en el capítulo
+\begin_inset LatexCommand \ref{cha:Benchmarks}
+
+\end_inset
+
+, en muchos casos es incluso más rápido usar el
+\series bold
+ZG
+\series default
+ ya que el
+\series bold
+Huffman
+\series default
+ tiene que comprimir menos y el proceso del
+\series bold
+ZG
+\series default
+ es mucho menor que el del
+\series bold
+Huffman
+\series default
+.
\layout Subsubsection*
Ejemplo:
\series default
es de 22 (incluso cuando hubieron expansiones).
Como se podrá ver en las pruebas del capítulo
-\begin_inset LatexCommand \vref{cha:Benchmarks}
+\begin_inset LatexCommand \ref{cha:Benchmarks}
\end_inset
Prueba Calgary Corpus
\layout Standard
-El set de prueba Calgary Corpus Test es utilizado internacionalmente para
- la prueba y comparación de compresores, contando con archivos diseñados
- especificamente para estos fines.
- Es por ello que hemos utilizado dicho set y a continuación exponemos los
- resultados:
+El conjunto de prueba Calgary Corpus Test es utilizado internacionalmente
+ para la prueba y comparación de compresores, contando con archivos diseñados
+ específicamente para estos fines.
+ Es por ello que hemos utilizado dicho conjunto y a continuación exponemos
+ los resultados:
\layout Standard