versión color - PET: Python Entre Todos - Python Argentina
versión color - PET: Python Entre Todos - Python Argentina
versión color - PET: Python Entre Todos - Python Argentina
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
25 Buffers<br />
Comprimir datos en memoria es un problema completamente diferente de la compresión de datos para almacenamiento. En<br />
memoria, necesitamos poder utilizar, y a veces modificar los datos. No es trivial el desarrollar un esquema de compresión que<br />
permita realizar de forma eficiente estas tareas.<br />
Un par bastante común es, en indexación, las técnicas conocida como delta-coding y prefix-coding. Estas técnicas permiten<br />
guardar conjuntos de números (para delta) o cadenas (para prefix) de forma eficiente.<br />
En ambos métodos se guardan conjuntos sin un orden particular. Es decir, se guardan los números a, b y c, pero no el orden en<br />
que se agregan al conjunto. Al no guardar el orden, la estructura se puede ordenar en memoria de forma tal que ocupe la menor<br />
cantidad de memoria posible.<br />
Veremos el caso de estructuras inmutables, puesto que la mutabilidad llevaría todo un estudio que puede leerse de internet.<br />
Pero es posible implementar versiones de estas estructuras que aceptan modificarse, aunque de forma limitada.<br />
En el caso de números, primero el conjunto se ordena, y luego se guarda cada número como la diferencia entre ese y el número<br />
previo. De esta manera, hace falta guardar números más pequeños, que es posible quepan en un byte, en vez de 4 u 8. Para<br />
poder aprovechar esto, los números se guardan en algo llamado rice code, que para números pequeños guarda un único byte, y<br />
para números más grandes guarda más bytes. Es lo que se llama un código de longitud variable.<br />
Una clase CompressedSet se puede ver como:<br />
class CompressedSet(object):<br />
def __init__(self, datos):<br />
self.datos = array.array('B')<br />
ini = 0<br />
for i in sorted(datos):<br />
delta = i - ini<br />
ini = i<br />
while 1:<br />
more = delta > 0x7f<br />
self.datos.append(0x80 * more + (delta & 0x7f))<br />
delta >>= 7<br />
if not more:<br />
break<br />
def __contains__(self, valor):<br />
for i in self:<br />
else:<br />
if i == valor:<br />
return True<br />
elif i > valor:<br />
return False<br />
return False<br />
def __iter__(self):<br />
x = 0<br />
val = 0<br />
for i in self.datos:<br />
more = (i & 0x80) != 0<br />
val |= (i & 0x7f)<br />
if more:<br />
else:<br />
val