07.12.2012 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!