2017-11-27 20:12 GMT+01:00 Jesus Cea <j...@jcea.es>: > On 27/11/17 19:01, Francesc Alted wrote: > > Sin embargo, antes de decidir si tu > > conjunto comprime bien o no, nunca está de más hacer una prueba. Lo que > > me hacía pensar en que tus datos podrían ser comprimibles es > > precisamente lo que decías de que los valores te llegaban ordenados, y > > sé que eso puede afectar mucho al ratio de compresión. Por ejemplo, > > usando un conjunto de números aleatorios de 1 millón de enteros de 64 > > bits (en total 8 MB) se tiene: > > Estás siendo un poco tramposo, Francesc :-). En tu ejemplo, tus datos no > ocupan 64 bits cada uno, ocupan 20 bits escasos. Además, como generas un > millón de valores en el rango 0-999999, la diferencia entre un valor y > el siguiente es muy pequeño, incluso cero :-).
> Así no vale :-). > > Bueno, más que tramposo me faltaba información sobre la distribución de tus datos; viendo que estás tratando con valores SHA256, ya veo de que estamos hablando :) De todas maneras, lo que intentaba era hacer ver que una ordenación siempre suele aumentar el ratio de compresión. Aquí hay un ejemplo mejor de lo que quería decir: In [40]: b = np.random.randint(2**63, size=1000*1000) In [41]: %time len(blosc.compress(b)) CPU times: user 74.8 ms, sys: 2.2 ms, total: 77 ms Wall time: 23 ms Out[41]: 8000016 # sin compresion In [42]: b.sort() In [43]: %time len(blosc.compress(b)) CPU times: user 51.1 ms, sys: 1.93 ms, total: 53 ms Wall time: 15.6 ms Out[43]: 6165702 # hay compression En los dos casos los datos son aleatorios, pero en el segundo caso están ordenados, y por tanto comprimen (un 23% de reducción en este caso, bastante notable para datos pseudo-aleatorios como éste). En tu caso creí entender que ordenabas los valores de alguna manera, pero viendo los ratios que obtienes, y que son bastante más pobres que mi prueba, posiblemente no entiendo bien a que te refieres cuando dices 'ordenados'. > Para quedarnos todos tranquilos, voy a ver mi caso real: > > >>> import blosc > >>> # Eliminamos el número de versión y el hash final de integridad > >>> data=open("XXXX", "rb").read()[1:-32] > >>> len(data) > 8041888 > >>> len(blosc.compress(data, typesize=32)) > 7898856 > >>> 100 * (1 - 7898856 / 8041888) > 1.7785873168091881 > > La compresión es del 1.78%. Es inferior al 3.3% de simplemente dividir > la tabla en 256 tablas y eliminar el primer byte de cada valor en cada > subtabla. Posiblemente se pueda llegar con facilidad al 3% con blosc > usando prefiltros. > Blosc usa el filtro de SHUFFLE por defecto, así que tus datos son claramente *dificilmente comprimibles*. > Mis datos son verdaderamente aleatorios en sus 256 bits. Son el SHA256 > de bloques de datos cifrados con claves a azar. Más (pseudo)aleatorio > imposible :-). > > Aplicar blosc a un filtro cuckoo donde los fingerprints son más pequeños > (digamos, 32 bits) parece más prometedor, pero en ese caso los > fingerprints no están ordenados, tendrán un orden aleatorio y tampoco > los vas a poder comprimir. Por ejemplo: > > >>> b=np.random.randint(2**32, size=1000*1000) > # NO HAGO EL 'SORT()' PORQUE EN UN FILTRO CUCKOO LOS FINGERPRINTS > # ESTAN DESORDENADOS. > >>> len(blosc.compress(b)) > 4018965 > > Dado que los datos ocupan realmente 4000000 bytes, blocs los expande un > 0.5%. > > Que conste que blosc me parece un proyecto espectacular. Sencillamente > no parece aplicable en este caso. > > Dicho lo cual, las discusiones sobre algoritmos me encantan. Sigamos :-). > > De momento sigo pensando que lo mejor que puedo hacer es usar "hash > cuckoo" con un posible "filtro cucko" con una pequeña tasa de falsos > positivos para una parte concreta del proceso. > > Por si alguien se pregunta sobre el uso de todo esto, se trata de un > sistema de localización de bloques de datos en un sistema de > almacenamiento distribuido donde no puedes controlar dónde se almacena > cada bloque, pero debes saber dónde está a la hora de buscarlo, o > declarar taxativametne que ese bloque no existe en el sistema. No se > controla dónde se guardan las cosas, no hay rebalanceo a posteriori ni > tampoco puedes contar con meter inteligencia en los nodos de > almacenamiento más allá de un WEBDAV para listar, leer y escribir > bloques (inmutables). > > A la hora de localizar bloques podría tolerarse una pequeña tasa de > falsos positivos, que te obligaría a buscar en dos servidores en vez de > solo en uno. Molesto, pero tolerable. Pero hay otras tareas donde no > puedo permitir falsos positivos, como es el caso de la replicación > (salvo que los falsos positivos se aleatoricen y sean diferentes cada > vez, aceptando que pueden ser necesario hacer varias replicaciones para > asegurarnos de que realmente está todo replicado) o el control de > integridad (verificar que no sobra ni falta ningún bloque en el sistema). > Probablemente ya lo habrás estudiado, pero con cosas como Cassandra o HBase no podrías atacar estos problemas? Si éstos te parecen demasiado 'pesados', a lo mejor un filesystem distribuido como Gluster ( https://en.wikipedia.org/wiki/Gluster) ayudaría. Y si quieres más bajo nivel todavía, qué tal un simple almacén de objetos? Hay un interesante artículo sobre esto en: https://www.digitalocean.com/community/tutorials/object-storage-vs-block-storage-services (a mí me gusta la aproximación de Ceph en particular). Francesc > > -- > Jesús Cea Avión _/_/ _/_/_/ _/_/_/ > j...@jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ > Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ > jabber / xmpp:j...@jabber.org _/_/ _/_/ _/_/ _/_/ _/_/ > "Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ > "My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/ > "El amor es poner tu felicidad en la felicidad de otro" - Leibniz > > > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es > > -- Francesc Alted
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es