From cm.agullo en gmail.com Wed Nov 15 06:10:20 2017 From: cm.agullo en gmail.com (Carlos Agullo) Date: Wed, 15 Nov 2017 12:10:20 +0100 Subject: [Python-es] Problema de variables con Pulp Message-ID: Hola, estoy intentando resolver un problema típico de "Blending Problem" con Pulp y no consigo poner bien las variables (concretamente el diccionario de variables) Este es el diccionario que quiero crear: num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, cat='Integer') pero me gustaría poner un límite superior para cada variable que tengo en un diccionario llamado poblacion. He intentado poner la restricción dentro de la definición del diccionario de variables así: num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, upBound=poblacion[soldados], cat='Integer') y también he intentado ponerlo al agregar el resto de restricciones del problema: prob += (num_soldados[i] < poblacion[i] for i in soldados y en ambos me da error. ¿cómo puedo poner un límite superior a las variables? A continuación pongo el código completo que no me da error por si sirve de ayuda: from pulp import * # Declarar variables soldados = ['Feng', 'Liu', 'Zhao', 'Jian'] presupuesto = 10000 #Diccionario con los costes de cada tipo de soldado coste = {'Feng':13, 'Liu':21, 'Zhao':17, 'Jian':100} #Diccionario con la fuerza de cada tipo de soldado fuerza = {'Feng':6, 'Liu':10, 'Zhao':8, 'Jian':40} #Diccionario con la población máxima de cada tipo de soldado poblacion = {'Feng':1000, 'Liu':400, 'Zhao':500, 'Jian':150} #Crear la variable 'prob' que contiene los datos del problema prob = LpProblem ("A Blending Problem", LpMaximize) #Crear un diccionario llamado "num_soldados" donde se definen las variables num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, cat='Integer') #Función objetivo prob += lpSum(fuerza[i]*num_soldados[i] for i in soldados), "Fuerza total del ejército" #Agregar las restricciones al 'prob' prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto #Resolver el problema status = prob.solve() LpStatus[status] # imprimir resultados for v in prob.variables(): print(v.name, "=", v.varValue) print("La fuerza total del ejército es: ", value(prob.objective)) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From davidmenhur en gmail.com Wed Nov 15 07:04:02 2017 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Wed, 15 Nov 2017 13:04:02 +0100 Subject: [Python-es] Problema de variables con Pulp In-Reply-To: References: Message-ID: Necesitas añadirlos como constraints: for i in soldados: prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i]) Explicación: en Python a < b se ejecuta de inmediato, Pulp necesita la expresión de alguna forma "simbólica", de ahí que tengas que dividirlo en la variable que estás restringiendo y el valor, o rhs (right hand side, la parte derecha de la expresión). Sense is el tipo de restricción, en este caso, LE less or equal, menor o igual. La documentación en cuestión, no la más clara que podría ser: https://www.coin-or.org/PuLP/pulp.html#pulp.LpConstraint Nótese que fácilmente lo puedes convertir en una restricción elástica, es decir, puedes comprarle unos pocos soldados Jian a tu vecino por un precio mayor, particularmente útil para ayudar la convergencia en problemas más complicados (el tuyo se puede resolver analíticamente). /David. 2017-11-15 12:10 GMT+01:00 Carlos Agullo : > Hola, estoy intentando resolver un problema típico de "Blending Problem" > con Pulp y no consigo poner bien las variables (concretamente el > diccionario de variables) > > Este es el diccionario que quiero crear: > > num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, > cat='Integer') > > pero me gustaría poner un límite superior para cada variable que tengo en > un diccionario llamado poblacion. > > He intentado poner la restricción dentro de la definición del diccionario > de variables así: > > num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, > upBound=poblacion[soldados], cat='Integer') > > y también he intentado ponerlo al agregar el resto de restricciones del > problema: > > prob += (num_soldados[i] < poblacion[i] for i in soldados > > y en ambos me da error. ¿cómo puedo poner un límite superior a las > variables? > > A continuación pongo el código completo que no me da error por si sirve de > ayuda: > > > from pulp import * > > # Declarar variables > soldados = ['Feng', 'Liu', 'Zhao', 'Jian'] > presupuesto = 10000 > > #Diccionario con los costes de cada tipo de soldado > coste = {'Feng':13, > 'Liu':21, > 'Zhao':17, > 'Jian':100} > > #Diccionario con la fuerza de cada tipo de soldado > fuerza = {'Feng':6, > 'Liu':10, > 'Zhao':8, > 'Jian':40} > > #Diccionario con la población máxima de cada tipo de soldado > poblacion = {'Feng':1000, > 'Liu':400, > 'Zhao':500, > 'Jian':150} > > #Crear la variable 'prob' que contiene los datos del problema > prob = LpProblem ("A Blending Problem", LpMaximize) > > #Crear un diccionario llamado "num_soldados" donde se definen las variables > num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, > cat='Integer') > > #Función objetivo > prob += lpSum(fuerza[i]*num_soldados[i] for i in soldados), "Fuerza total > del ejército" > > #Agregar las restricciones al 'prob' > prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto > > > #Resolver el problema > status = prob.solve() > LpStatus[status] > > # imprimir resultados > for v in prob.variables(): > print(v.name, "=", v.varValue) > > print("La fuerza total del ejército es: ", value(prob.objective)) > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From cm.agullo en gmail.com Wed Nov 15 07:25:38 2017 From: cm.agullo en gmail.com (Carlos Agullo) Date: Wed, 15 Nov 2017 13:25:38 +0100 Subject: [Python-es] Problema de variables con Pulp In-Reply-To: References: Message-ID: Muchas gracias David!!! Ahora he aprendido algo más (lo de las 'Constraints') lo único es que cuando pongo sólo lo que tú me dices me da error diciendo que "i" no está definida. Si lo pongo así: prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i]) for i in soldados me dice "invalid syntax" y si lo pongo dentro del paréntesis, así: prob += LpConstraint(num_soldados[i] for i in soldados, sense=LpConstraintLE, rhs=poblacion[i] ) me dice "Generator expression must be parenthesized if not sole argument" Así que aunque entiendo lo de las "constraints" no consigo usarlo bien El 15 de noviembre de 2017, 13:04, Da?id escribió: > Necesitas añadirlos como constraints: > > for i in soldados: > prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, > rhs=poblacion[i]) > > Explicación: en Python a < b se ejecuta de inmediato, Pulp necesita la > expresión de alguna forma "simbólica", de ahí que tengas que dividirlo en > la variable que estás restringiendo y el valor, o rhs (right hand side, la > parte derecha de la expresión). Sense is el tipo de restricción, en este > caso, LE less or equal, menor o igual. > > La documentación en cuestión, no la más clara que podría ser: > https://www.coin-or.org/PuLP/pulp.html#pulp.LpConstraint > > Nótese que fácilmente lo puedes convertir en una restricción elástica, es > decir, puedes comprarle unos pocos soldados Jian a tu vecino por un precio > mayor, particularmente útil para ayudar la convergencia en problemas más > complicados (el tuyo se puede resolver analíticamente). > > > /David. > > > > > 2017-11-15 12:10 GMT+01:00 Carlos Agullo : > >> Hola, estoy intentando resolver un problema típico de "Blending Problem" >> con Pulp y no consigo poner bien las variables (concretamente el >> diccionario de variables) >> >> Este es el diccionario que quiero crear: >> >> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >> cat='Integer') >> >> pero me gustaría poner un límite superior para cada variable que tengo en >> un diccionario llamado poblacion. >> >> He intentado poner la restricción dentro de la definición del diccionario >> de variables así: >> >> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >> upBound=poblacion[soldados], cat='Integer') >> >> y también he intentado ponerlo al agregar el resto de restricciones del >> problema: >> >> prob += (num_soldados[i] < poblacion[i] for i in soldados >> >> y en ambos me da error. ¿cómo puedo poner un límite superior a las >> variables? >> >> A continuación pongo el código completo que no me da error por si sirve >> de ayuda: >> >> >> from pulp import * >> >> # Declarar variables >> soldados = ['Feng', 'Liu', 'Zhao', 'Jian'] >> presupuesto = 10000 >> >> #Diccionario con los costes de cada tipo de soldado >> coste = {'Feng':13, >> 'Liu':21, >> 'Zhao':17, >> 'Jian':100} >> >> #Diccionario con la fuerza de cada tipo de soldado >> fuerza = {'Feng':6, >> 'Liu':10, >> 'Zhao':8, >> 'Jian':40} >> >> #Diccionario con la población máxima de cada tipo de soldado >> poblacion = {'Feng':1000, >> 'Liu':400, >> 'Zhao':500, >> 'Jian':150} >> >> #Crear la variable 'prob' que contiene los datos del problema >> prob = LpProblem ("A Blending Problem", LpMaximize) >> >> #Crear un diccionario llamado "num_soldados" donde se definen las >> variables >> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >> cat='Integer') >> >> #Función objetivo >> prob += lpSum(fuerza[i]*num_soldados[i] for i in soldados), "Fuerza >> total del ejército" >> >> #Agregar las restricciones al 'prob' >> prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto >> >> >> #Resolver el problema >> status = prob.solve() >> LpStatus[status] >> >> # imprimir resultados >> for v in prob.variables(): >> print(v.name, "=", v.varValue) >> >> print("La fuerza total del ejército es: ", value(prob.objective)) >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From davidmenhur en gmail.com Wed Nov 15 07:37:02 2017 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Wed, 15 Nov 2017 13:37:02 +0100 Subject: [Python-es] Problema de variables con Pulp In-Reply-To: References: Message-ID: Estás añadiendo una restricción por cada tipo de soldado, así que tienes que instanciar cuatro LpConstraints: for i in soldados: prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i]) 2017-11-15 13:25 GMT+01:00 Carlos Agullo : > Muchas gracias David!!! > > Ahora he aprendido algo más (lo de las 'Constraints') lo único es que > cuando pongo sólo lo que tú me dices me da error diciendo que "i" no está > definida. Si lo pongo así: > > prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, > rhs=poblacion[i]) for i in soldados > > me dice "invalid syntax" > > y si lo pongo dentro del paréntesis, así: > > prob += LpConstraint(num_soldados[i] for i in soldados, > sense=LpConstraintLE, rhs=poblacion[i] ) > > me dice "Generator expression must be parenthesized if not sole argument" > > Así que aunque entiendo lo de las "constraints" no consigo usarlo bien > > > > > El 15 de noviembre de 2017, 13:04, Da?id escribió: > >> Necesitas añadirlos como constraints: >> >> for i in soldados: >> prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, >> rhs=poblacion[i]) >> >> Explicación: en Python a < b se ejecuta de inmediato, Pulp necesita la >> expresión de alguna forma "simbólica", de ahí que tengas que dividirlo en >> la variable que estás restringiendo y el valor, o rhs (right hand side, la >> parte derecha de la expresión). Sense is el tipo de restricción, en este >> caso, LE less or equal, menor o igual. >> >> La documentación en cuestión, no la más clara que podría ser: >> https://www.coin-or.org/PuLP/pulp.html#pulp.LpConstraint >> >> Nótese que fácilmente lo puedes convertir en una restricción elástica, es >> decir, puedes comprarle unos pocos soldados Jian a tu vecino por un precio >> mayor, particularmente útil para ayudar la convergencia en problemas más >> complicados (el tuyo se puede resolver analíticamente). >> >> >> /David. >> >> >> >> >> 2017-11-15 12:10 GMT+01:00 Carlos Agullo : >> >>> Hola, estoy intentando resolver un problema típico de "Blending Problem" >>> con Pulp y no consigo poner bien las variables (concretamente el >>> diccionario de variables) >>> >>> Este es el diccionario que quiero crear: >>> >>> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >>> cat='Integer') >>> >>> pero me gustaría poner un límite superior para cada variable que tengo >>> en un diccionario llamado poblacion. >>> >>> He intentado poner la restricción dentro de la definición del >>> diccionario de variables así: >>> >>> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >>> upBound=poblacion[soldados], cat='Integer') >>> >>> y también he intentado ponerlo al agregar el resto de restricciones del >>> problema: >>> >>> prob += (num_soldados[i] < poblacion[i] for i in soldados >>> >>> y en ambos me da error. ¿cómo puedo poner un límite superior a las >>> variables? >>> >>> A continuación pongo el código completo que no me da error por si sirve >>> de ayuda: >>> >>> >>> from pulp import * >>> >>> # Declarar variables >>> soldados = ['Feng', 'Liu', 'Zhao', 'Jian'] >>> presupuesto = 10000 >>> >>> #Diccionario con los costes de cada tipo de soldado >>> coste = {'Feng':13, >>> 'Liu':21, >>> 'Zhao':17, >>> 'Jian':100} >>> >>> #Diccionario con la fuerza de cada tipo de soldado >>> fuerza = {'Feng':6, >>> 'Liu':10, >>> 'Zhao':8, >>> 'Jian':40} >>> >>> #Diccionario con la población máxima de cada tipo de soldado >>> poblacion = {'Feng':1000, >>> 'Liu':400, >>> 'Zhao':500, >>> 'Jian':150} >>> >>> #Crear la variable 'prob' que contiene los datos del problema >>> prob = LpProblem ("A Blending Problem", LpMaximize) >>> >>> #Crear un diccionario llamado "num_soldados" donde se definen las >>> variables >>> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >>> cat='Integer') >>> >>> #Función objetivo >>> prob += lpSum(fuerza[i]*num_soldados[i] for i in soldados), "Fuerza >>> total del ejército" >>> >>> #Agregar las restricciones al 'prob' >>> prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto >>> >>> >>> #Resolver el problema >>> status = prob.solve() >>> LpStatus[status] >>> >>> # imprimir resultados >>> for v in prob.variables(): >>> print(v.name, "=", v.varValue) >>> >>> print("La fuerza total del ejército es: ", value(prob.objective)) >>> >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >>> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From cm.agullo en gmail.com Wed Nov 15 10:22:16 2017 From: cm.agullo en gmail.com (Carlos Agullo) Date: Wed, 15 Nov 2017 16:22:16 +0100 Subject: [Python-es] Problema de variables con Pulp In-Reply-To: References: Message-ID: Hecho y entendido!!!! muchas gracias El 15 de noviembre de 2017, 13:37, Da?id escribió: > Estás añadiendo una restricción por cada tipo de soldado, así que tienes > que instanciar cuatro LpConstraints: > > for i in soldados: prob += LpConstraint(num_soldados[i], > sense=LpConstraintLE, rhs=poblacion[i]) > > > 2017-11-15 13:25 GMT+01:00 Carlos Agullo : > >> Muchas gracias David!!! >> >> Ahora he aprendido algo más (lo de las 'Constraints') lo único es que >> cuando pongo sólo lo que tú me dices me da error diciendo que "i" no está >> definida. Si lo pongo así: >> >> prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, >> rhs=poblacion[i]) for i in soldados >> >> me dice "invalid syntax" >> >> y si lo pongo dentro del paréntesis, así: >> >> prob += LpConstraint(num_soldados[i] for i in soldados, >> sense=LpConstraintLE, rhs=poblacion[i] ) >> >> me dice "Generator expression must be parenthesized if not sole argument" >> >> Así que aunque entiendo lo de las "constraints" no consigo usarlo bien >> >> >> >> >> El 15 de noviembre de 2017, 13:04, Da?id >> escribió: >> >>> Necesitas añadirlos como constraints: >>> >>> for i in soldados: >>> prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, >>> rhs=poblacion[i]) >>> >>> Explicación: en Python a < b se ejecuta de inmediato, Pulp necesita la >>> expresión de alguna forma "simbólica", de ahí que tengas que dividirlo en >>> la variable que estás restringiendo y el valor, o rhs (right hand side, la >>> parte derecha de la expresión). Sense is el tipo de restricción, en este >>> caso, LE less or equal, menor o igual. >>> >>> La documentación en cuestión, no la más clara que podría ser: >>> https://www.coin-or.org/PuLP/pulp.html#pulp.LpConstraint >>> >>> Nótese que fácilmente lo puedes convertir en una restricción elástica, >>> es decir, puedes comprarle unos pocos soldados Jian a tu vecino por un >>> precio mayor, particularmente útil para ayudar la convergencia en problemas >>> más complicados (el tuyo se puede resolver analíticamente). >>> >>> >>> /David. >>> >>> >>> >>> >>> 2017-11-15 12:10 GMT+01:00 Carlos Agullo : >>> >>>> Hola, estoy intentando resolver un problema típico de "Blending >>>> Problem" con Pulp y no consigo poner bien las variables (concretamente el >>>> diccionario de variables) >>>> >>>> Este es el diccionario que quiero crear: >>>> >>>> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >>>> cat='Integer') >>>> >>>> pero me gustaría poner un límite superior para cada variable que tengo >>>> en un diccionario llamado poblacion. >>>> >>>> He intentado poner la restricción dentro de la definición del >>>> diccionario de variables así: >>>> >>>> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >>>> upBound=poblacion[soldados], cat='Integer') >>>> >>>> y también he intentado ponerlo al agregar el resto de restricciones del >>>> problema: >>>> >>>> prob += (num_soldados[i] < poblacion[i] for i in soldados >>>> >>>> y en ambos me da error. ¿cómo puedo poner un límite superior a las >>>> variables? >>>> >>>> A continuación pongo el código completo que no me da error por si sirve >>>> de ayuda: >>>> >>>> >>>> from pulp import * >>>> >>>> # Declarar variables >>>> soldados = ['Feng', 'Liu', 'Zhao', 'Jian'] >>>> presupuesto = 10000 >>>> >>>> #Diccionario con los costes de cada tipo de soldado >>>> coste = {'Feng':13, >>>> 'Liu':21, >>>> 'Zhao':17, >>>> 'Jian':100} >>>> >>>> #Diccionario con la fuerza de cada tipo de soldado >>>> fuerza = {'Feng':6, >>>> 'Liu':10, >>>> 'Zhao':8, >>>> 'Jian':40} >>>> >>>> #Diccionario con la población máxima de cada tipo de soldado >>>> poblacion = {'Feng':1000, >>>> 'Liu':400, >>>> 'Zhao':500, >>>> 'Jian':150} >>>> >>>> #Crear la variable 'prob' que contiene los datos del problema >>>> prob = LpProblem ("A Blending Problem", LpMaximize) >>>> >>>> #Crear un diccionario llamado "num_soldados" donde se definen las >>>> variables >>>> num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, >>>> cat='Integer') >>>> >>>> #Función objetivo >>>> prob += lpSum(fuerza[i]*num_soldados[i] for i in soldados), "Fuerza >>>> total del ejército" >>>> >>>> #Agregar las restricciones al 'prob' >>>> prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto >>>> >>>> >>>> #Resolver el problema >>>> status = prob.solve() >>>> LpStatus[status] >>>> >>>> # imprimir resultados >>>> for v in prob.variables(): >>>> print(v.name, "=", v.varValue) >>>> >>>> print("La fuerza total del ejército es: ", value(prob.objective)) >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >>> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcea en jcea.es Sun Nov 26 23:13:02 2017 From: jcea en jcea.es (Jesus Cea) Date: Mon, 27 Nov 2017 05:13:02 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= Message-ID: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> Requisitos: Tengo millones de bloques binarios de 256 bits. Estos millones de bloques están divididos aleatoriamente en grupos, digamos de un millón de elementos. Las operaciones básicas que debo soportar son: 1. Creación de un grupo. Una vez creado un grupo, no necesita ser actualizado. Ni para añadir ni para eliminar. 2. Comprobar si un elemento pertenece a un grupo concreto. 3. Generar un grupo nuevo como unión de dos o más grupos. 4. Generación de un grupo nuevo como intersección de dos o más grupos. 5. Iterar sobre un grupo. El orden no es importante. A nivel de limitaciones, la más importante es que la sobrecarga en memoria debe ser lo mínimo posible. Cada elemento ocupa 32 bytes (256 bits). La segunda más importante es que el algoritmo debe ser "cache friendly", sobre todo en la parte de búsqueda de pertenencia. En realidad solo necesito que el número de bloques de memoria de 4096 bytes que se revisan para buscar un elemento sea lo más bajo posible, porque el entorno de trabajo tiene muy poca memoria RAM pero se puede tirar de SWAP. No puedo tolerar falsos positivos, así que no puedo usar filtros bloom o filtros cuckoo. De momento la estructura de datos que va ganando son los hashes cuckoo: La ocupación de memoria es prácticamente óptima y solo requiere acceder a dos bloques de 4096 bytes. En cuanto a los datos en sí, son valores de 256 bits aleatorios. Ahora mismo los recibo en orden numérico, pero podría generar cualqueir otra estructura. Por ejemplo, podrían almacenarse directamente como un hash cuckoo para no tener que regenerarlos en tiempo de ejecución cada vez. Buscando en PYPI veo un par de proyectos que implementan filtros cuckoo. En principio no me sirven porque están escritos en Python nativo sin prestar atención al uso de memoria y porque no tolero falsos positivos. Dado que tengo los datos ya ordenados en la entrada, una opción evidente sería usar MMAP para verlos en memoria y hacer búsquedas mediante bisección. Esto sería óptimo en consumo de memoria, pero teniendo grupos de 8 megabytes, estaría tocando unos 11 bloques de 4096 bytes por cada comprobación de pertenencia. Aún suponiendo que los bloques más "calientes" estén cacheados en RAM, es preferible que el almacenamiento nativo sea un chuckoo hash, que nos garantiza un máximo de acceso a dos bloques de 4096 bytes. Usar un "set()" nativo de Python me garantiza un acceso típico de uno o dos bloques de 4096 bytes (bien) pero la ocupación en memoria es importante: entre dos y tres veces el tamaño de los datos originales. ¿Alguna sugerencia?. Gracias por vuestras neuronas :-). Cuckoo hashing: https://en.wikipedia.org/wiki/Cuckoo_hashing Cuento con programar el algoritmo en C o en Cython, si no encuentro nada hecho. -- Jesús Cea Avión _/_/ _/_/_/ _/_/_/ jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ jabber / xmpp:jcea en 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 ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: OpenPGP digital signature URL: From faltet en gmail.com Mon Nov 27 04:29:07 2017 From: faltet en gmail.com (Francesc Alted) Date: Mon, 27 Nov 2017 10:29:07 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> Message-ID: Lo único que se me ocurre es que, para minimizar el uso de memoria uses compresión para tus bloques binarios (dices que te llegan ordenados numéricamente, así que seguro que se pueden obtener buenos ratios de compresión). Para las búsquedas puedes continuar usando hashes cuckoo, pero sólo guardando las claves, no los valores, y así maximizas la localidad de los accesos a memoria (durante la búsqueda no te sirve de nada traer los valores a las lineas de cache). Una vez localizado el lugar donde está el valor puedes acceder al bloque comprimido que toque, descomprimir, y extraerlo. Blosc te permite esta clase de acceso de manera muy eficiente a través de la llamada `blosc_getitem()` ( https://github.com/Blosc/c-blosc/blob/master/blosc/blosc.h#L290). Si eliges el tamaño de bloque lo suficientemente pequeño (digamos 4/8/16/32 KB), la descompresión normalmente sucede en la cache L1, así que es muy rápido. Francesc 2017-11-27 5:13 GMT+01:00 Jesus Cea : > Requisitos: > > Tengo millones de bloques binarios de 256 bits. Estos millones de > bloques están divididos aleatoriamente en grupos, digamos de un millón > de elementos. > > Las operaciones básicas que debo soportar son: > > 1. Creación de un grupo. Una vez creado un grupo, no necesita ser > actualizado. Ni para añadir ni para eliminar. > > 2. Comprobar si un elemento pertenece a un grupo concreto. > > 3. Generar un grupo nuevo como unión de dos o más grupos. > > 4. Generación de un grupo nuevo como intersección de dos o más grupos. > > 5. Iterar sobre un grupo. El orden no es importante. > > A nivel de limitaciones, la más importante es que la sobrecarga en > memoria debe ser lo mínimo posible. Cada elemento ocupa 32 bytes (256 > bits). La segunda más importante es que el algoritmo debe ser "cache > friendly", sobre todo en la parte de búsqueda de pertenencia. En > realidad solo necesito que el número de bloques de memoria de 4096 bytes > que se revisan para buscar un elemento sea lo más bajo posible, porque > el entorno de trabajo tiene muy poca memoria RAM pero se puede tirar de > SWAP. > > No puedo tolerar falsos positivos, así que no puedo usar filtros bloom o > filtros cuckoo. De momento la estructura de datos que va ganando son los > hashes cuckoo: La ocupación de memoria es prácticamente óptima y solo > requiere acceder a dos bloques de 4096 bytes. > > En cuanto a los datos en sí, son valores de 256 bits aleatorios. Ahora > mismo los recibo en orden numérico, pero podría generar cualqueir otra > estructura. Por ejemplo, podrían almacenarse directamente como un hash > cuckoo para no tener que regenerarlos en tiempo de ejecución cada vez. > > Buscando en PYPI veo un par de proyectos que implementan filtros cuckoo. > En principio no me sirven porque están escritos en Python nativo sin > prestar atención al uso de memoria y porque no tolero falsos positivos. > > Dado que tengo los datos ya ordenados en la entrada, una opción evidente > sería usar MMAP para verlos en memoria y hacer búsquedas mediante > bisección. Esto sería óptimo en consumo de memoria, pero teniendo grupos > de 8 megabytes, estaría tocando unos 11 bloques de 4096 bytes por cada > comprobación de pertenencia. Aún suponiendo que los bloques más > "calientes" estén cacheados en RAM, es preferible que el almacenamiento > nativo sea un chuckoo hash, que nos garantiza un máximo de acceso a dos > bloques de 4096 bytes. > > Usar un "set()" nativo de Python me garantiza un acceso típico de uno o > dos bloques de 4096 bytes (bien) pero la ocupación en memoria es > importante: entre dos y tres veces el tamaño de los datos originales. > > ¿Alguna sugerencia?. > > Gracias por vuestras neuronas :-). > > Cuckoo hashing: https://en.wikipedia.org/wiki/Cuckoo_hashing > > Cuento con programar el algoritmo en C o en Cython, si no encuentro nada > hecho. > > -- > Jesús Cea Avión _/_/ _/_/_/ _/_/_/ > jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ > Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ > jabber / xmpp:jcea en 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 en python.org > https://mail.python.org/mailman/listinfo/python-es > > -- Francesc Alted ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcea en jcea.es Mon Nov 27 10:25:51 2017 From: jcea en jcea.es (Jesus Cea) Date: Mon, 27 Nov 2017 16:25:51 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> Message-ID: <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> On 27/11/17 10:29, Francesc Alted wrote: > Lo único que se me ocurre es que, para minimizar el uso de memoria uses > compresión para tus bloques binarios (dices que te llegan ordenados > numéricamente, así que seguro que se pueden obtener buenos ratios de > compresión). En realidad la compresión es mínima y no compensa. Son valores aleatorios de 256 bits. Aunque estén ordenados de forma numérica, la ganancia es mínima. Por ejemplo, un grupo típico tiene 256000 valores. Como cada valor tiene 256 bits, eso supone que cada fragmento de 1000 valores consecutivos empieza con el mismo byte. Dividiendo esa tabla de 256000 valores en 256 tablas de 1000 valores cada una, ocupando cada entrada 31 bytes en vez de 32 (porque el primer byte es implícito), la ganancia es de 32->31 bytes, es decir, apenas un 3%. Algo es algo, es verdad. Pero no sé si me compensa picar código para ganar un 3%. Además, si uso algo tipo "cuckoo hashing", no puedo aplicar esa compresión en memoria, que es donde la necesitaría (para paginar lo mínimo posible). > Para las búsquedas puedes continuar usando hashes cuckoo, > pero sólo guardando las claves, no los valores Es cierto, no lo he explicado: Estoy usando esto para "conjuntos", no para "diccionarios". Es decir, solo hay claves, no hay valores :). Pero buen apunte para otra ocasión. > clase de acceso de manera muy eficiente a través de la llamada > `blosc_getitem()` Valoré Blosc brevemente, pero considero que mis datos son "incompresibles" en RAM. Estoy más interesado en la parte de la estructura de datos a utilizar para que las búsquedas sean eficientes considerando que tengo poca RAM, no hay localidad de acceso en las búsquedas (los datos que se buscan son aleatorios y no hay correlación entre ellos) y puedo necesitar paginar al SWAP. Por eso estoy tan interesado en reducir al mínimo los accesos a páginas diferentes de 4096 bytes (La unidad de paginación). Los haskes cuckoo me garantizan un máximo de dos accesos por búsqueda en el peor de los casos. Posiblemente no sea mejorable y, básicamente me interesa que alguien me diga "pues estás equivocado, Jesús, mírate el algoritmo XXX, que te garantiza un único acceso a página". De hecho en este caso existe una posibilidad más: Como los datos son aleatorios y "bien repartidos", podría hacer una búsqueda "estimativa" en plan: "me da en la nariz que el valor, si existe, está en esta zona" y buscar directamente allí. Las búsquedas dentro de una página de 4096 bytes las considero "gratis". Lo que duele es la paginación. 4096 bytes me dan para 128 entradas. Mirarlas una a una es "gratis" comparado con tocar el disco duro. Esto ya lo había pensado, pero lo cierto es que por necesidades del sistema no puedo basarme en que los datos estén "bien repartidos". Ahora mismo lo están, pero no es un requerimiento de diseño y puede no cumplirse en el futuro. Necesito algo capaz de sobrevivir a "sesgos". Otra posibilidad sería tener una tabla con el primer primer registro de cada página de 4096 bytes. Es decir, 32 bytes por cada 128 registros (4kbytes). Si mi conjunto tiene 2560000 entradas, son 2000 páginas de 4096 bytes. Puedo tener un índice de 2000 entradas (64000 bytes, 16 páginas de 4096 bytes). La búsqueda en el índice es binaria y podría tocar 4 páginas, pero es razonable pensar que un índice de 64Kbytes sí lo puedo mantener en RAM, incluso con un "MAP_LOCKED" o "mlock()". Claro que el problema es que mis datos no miden 256000 entradas. Son docenas de conjuntos, cada uno con 256000 entradas. No estamos hablando de 64 kbytes en RAM para el índice, sino 64*número de conjuntos, y ese numero de conjuntos va por los cientos y subiendo. En fin, el asunto es engañosamente sencillo. De momento va ganando el cuckoo hashing. Es una estructura sencilla y me garantiza un máximo de dos accesos a página, por muy grandes o muy raros que sean mis datos. Mi esperanza es que alguien me sugiera algo mejor :-). Para uno de los modos de uso del sistema, el que más me importa, estoy valorando usar "filtros cuckoo", tolerando un pequeño nivel de falsos positivos, del orden del UNO por millón. Sigo teniendo dos accesos por búsqueda, pero como ahora la estructura es más pequeña es más factible que el número de accesos al SWAP se reduzca (recordemos que lo que me penaliza es la paginación, las búsquedas en memoria las considero gratis). Esto complicaría ese caso de uso porque ahora podría tener falsos positivos, lo que supone que una vez por millón de accesos voy a ir a buscar el dato a un servidor, me va decir que no está ahí y luego tengo que hacer un acceso al servidor "por defecto". Ese "error" es muy costoso en recursos y tiempo, pero si solo ocurre una vez por millón de accesos, el coste amortizado es bajo. Decisiones, decisiones... Gracias por responder, Francesc. Buen aporte. -- Jesús Cea Avión _/_/ _/_/_/ _/_/_/ jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ jabber / xmpp:jcea en 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 ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: OpenPGP digital signature URL: From faltet en gmail.com Mon Nov 27 13:01:32 2017 From: faltet en gmail.com (Francesc Alted) Date: Mon, 27 Nov 2017 19:01:32 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> Message-ID: 2017-11-27 16:25 GMT+01:00 Jesus Cea : > On 27/11/17 10:29, Francesc Alted wrote: > > Lo único que se me ocurre es que, para minimizar el uso de memoria uses > > compresión para tus bloques binarios (dices que te llegan ordenados > > numéricamente, así que seguro que se pueden obtener buenos ratios de > > compresión). > > En realidad la compresión es mínima y no compensa. Son valores > aleatorios de 256 bits. Aunque estén ordenados de forma numérica, la > ganancia es mínima. > > Por ejemplo, un grupo típico tiene 256000 valores. Como cada valor tiene > 256 bits, eso supone que cada fragmento de 1000 valores consecutivos > empieza con el mismo byte. Dividiendo esa tabla de 256000 valores en 256 > tablas de 1000 valores cada una, ocupando cada entrada 31 bytes en vez > de 32 (porque el primer byte es implícito), la ganancia es de 32->31 > bytes, es decir, apenas un 3%. Algo es algo, es verdad. Pero no sé si me > compensa picar código para ganar un 3%. > ?Correcto, un 3% es demasiado poco. 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: In [1]: import numpy as np In [2]: import blosc In [3]: b = np.random.randint(1000*1000, size=1000*1000) In [4]: %time len(blosc.compress(b)) CPU times: user 40.4 ms, sys: 5.15 ms, total: 45.5 ms Wall time: 13.3 ms Out[4]: 2878893 In [5]: b.sort() In [6]: %time len(blosc.compress(b)) CPU times: user 16.6 ms, sys: 434 µs, total: 17.1 ms Wall time: 4.71 ms Out[6]: 765295 ?lo que significa que la compresión de series numéricas ordenadas funciona mucho mejor (6x mejor en este caso, para un cratio de más de 17x sobre los datos sin comprimir). Esto es así porque Blosc hace uso de filtros especiales (llamados shufflers) para poner los bytes más significativos juntos, y por tanto reduciendo (normalmente) la entropía. Eso no quiere decir que esto se vaya a cumplir para tus datos pero como me gusta decir, no hay sustituto para una prueba ;) > > Además, si uso algo tipo "cuckoo hashing", no puedo aplicar esa > compresión en memoria, que es donde la necesitaría (para paginar lo > mínimo posible). > > > Para las búsquedas puedes continuar usando hashes cuckoo, > > pero sólo guardando las claves, no los valores > > Es cierto, no lo he explicado: Estoy usando esto para "conjuntos", no > para "diccionarios". Es decir, solo hay claves, no hay valores :). Pero > buen apunte para otra ocasión. > ?Vale, lo hab ?í? a entendido mal? ?; en ese caso los hashes cuckoo no serán muy útiles. Sin embargo, la otra aproximación que apuntas, la del filtro cuckoo, al usar fingerprints mucho más cortos, sí que podría funcionar ya que aunque el número de falsos positivos sea un poco alto, la alta velocidad de decompre?sión de Blosc permite una verificación bastante rápida en la estructura de los conjuntos de claves comprimidos (todo esto suponiendo que la compresión funcione bien para tu caso). ?Bueno, ya nos contarás cual ha sido tu decisión; nos has dejado intrigados :)? Francesc > > > clase de acceso de manera muy eficiente a través de la llamada > > `blosc_getitem()` > > Valoré Blosc brevemente, pero considero que mis datos son > "incompresibles" en RAM. Estoy más interesado en la parte de la > estructura de datos a utilizar para que las búsquedas sean eficientes > considerando que tengo poca RAM, no hay localidad de acceso en las > búsquedas (los datos que se buscan son aleatorios y no hay correlación > entre ellos) y puedo necesitar paginar al SWAP. Por eso estoy tan > interesado en reducir al mínimo los accesos a páginas diferentes de 4096 > bytes (La unidad de paginación). Los haskes cuckoo me garantizan un > máximo de dos accesos por búsqueda en el peor de los casos. Posiblemente > no sea mejorable y, básicamente me interesa que alguien me diga "pues > estás equivocado, Jesús, mírate el algoritmo XXX, que te garantiza un > único acceso a página". > > De hecho en este caso existe una posibilidad más: Como los datos son > aleatorios y "bien repartidos", podría hacer una búsqueda "estimativa" > en plan: "me da en la nariz que el valor, si existe, está en esta zona" > y buscar directamente allí. Las búsquedas dentro de una página de 4096 > bytes las considero "gratis". Lo que duele es la paginación. 4096 bytes > me dan para 128 entradas. Mirarlas una a una es "gratis" comparado con > tocar el disco duro. > > Esto ya lo había pensado, pero lo cierto es que por necesidades del > sistema no puedo basarme en que los datos estén "bien repartidos". Ahora > mismo lo están, pero no es un requerimiento de diseño y puede no > cumplirse en el futuro. Necesito algo capaz de sobrevivir a "sesgos". > > Otra posibilidad sería tener una tabla con el primer primer registro de > cada página de 4096 bytes. Es decir, 32 bytes por cada 128 registros > (4kbytes). Si mi conjunto tiene 2560000 entradas, son 2000 páginas de > 4096 bytes. Puedo tener un índice de 2000 entradas (64000 bytes, 16 > páginas de 4096 bytes). La búsqueda en el índice es binaria y podría > tocar 4 páginas, pero es razonable pensar que un índice de 64Kbytes sí > lo puedo mantener en RAM, incluso con un "MAP_LOCKED" o "mlock()". > > Claro que el problema es que mis datos no miden 256000 entradas. Son > docenas de conjuntos, cada uno con 256000 entradas. No estamos hablando > de 64 kbytes en RAM para el índice, sino 64*número de conjuntos, y ese > numero de conjuntos va por los cientos y subiendo. > > En fin, el asunto es engañosamente sencillo. > > De momento va ganando el cuckoo hashing. Es una estructura sencilla y me > garantiza un máximo de dos accesos a página, por muy grandes o muy raros > que sean mis datos. > > Mi esperanza es que alguien me sugiera algo mejor :-). > > Para uno de los modos de uso del sistema, el que más me importa, estoy > valorando usar "filtros cuckoo", tolerando un pequeño nivel de falsos > positivos, del orden del UNO por millón. Sigo teniendo dos accesos por > búsqueda, pero como ahora la estructura es más pequeña es más factible > que el número de accesos al SWAP se reduzca (recordemos que lo que me > penaliza es la paginación, las búsquedas en memoria las considero > gratis). Esto complicaría ese caso de uso porque ahora podría tener > falsos positivos, lo que supone que una vez por millón de accesos voy a > ir a buscar el dato a un servidor, me va decir que no está ahí y luego > tengo que hacer un acceso al servidor "por defecto". Ese "error" es muy > costoso en recursos y tiempo, pero si solo ocurre una vez por millón de > accesos, el coste amortizado es bajo. > > Decisiones, decisiones... > > Gracias por responder, Francesc. Buen aporte. > > -- > Jesús Cea Avión _/_/ _/_/_/ _/_/_/ > jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ > Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ > jabber / xmpp:jcea en 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 en python.org > https://mail.python.org/mailman/listinfo/python-es > > -- Francesc Alted ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcea en jcea.es Mon Nov 27 14:12:37 2017 From: jcea en jcea.es (Jesus Cea) Date: Mon, 27 Nov 2017 20:12:37 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> Message-ID: <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@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 :-). 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. 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). -- Jesús Cea Avión _/_/ _/_/_/ _/_/_/ jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ jabber / xmpp:jcea en 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 ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: OpenPGP digital signature URL: From faltet en gmail.com Mon Nov 27 15:38:03 2017 From: faltet en gmail.com (Francesc Alted) Date: Mon, 27 Nov 2017 21:38:03 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> Message-ID: 2017-11-27 20:12 GMT+01:00 Jesus Cea : > 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 _/_/ _/_/_/ _/_/_/ > jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ > Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ > jabber / xmpp:jcea en 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 en python.org > https://mail.python.org/mailman/listinfo/python-es > > -- Francesc Alted ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcea en jcea.es Mon Nov 27 17:37:03 2017 From: jcea en jcea.es (Jesus Cea) Date: Mon, 27 Nov 2017 23:37:03 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> Message-ID: <17b40d06-c6f8-d59c-8fd2-2aebe7264dce@jcea.es> On 27/11/17 21:38, Francesc Alted wrote: > 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) Estás usando 63 bits, no 64, pero vale :-) Ordenar mejora la compresión porque estamos reduciendo la entropía de los datos. En mi caso, si tengo 256000 valores diferentes, podrían ordenarse de 256000! maneras, un número de 1.4 millones de dígitos. Si de todas esas posibilidades me quedo exclusivamente con la versión ordenada numéricamente, me ahorro (por entropía) unos 4229911 bits (aproximación de Stirling del factorial). Es decir, un compresor perfecto comprimiría mis 8192000 bytes perfectamente aleatorios a 7663261 bytes. Una compresión teórica máxima del 6.45%. Si los datos son verdaderamente aleatorios y la única estructura que tenemos es que están ordenados, no podemos comprimir más que un 6.45%. Salvo error matemático por mi parte. (considerando 256000 valores de 256 bits aleatorios). Por tanto, insisto nuevamente, me centraría en buscar una estructura de datos que acceda al mínimo posible de páginas de RAM, no en comprimir, porque por la parte de compresión estoy limitado al 6.45% de un compresor ideal que no existe. Usemos la fórmula para analizar tu ejemplo. Un millón de valores son 1e6! de combinaciones de ordenación. Si me quedo solo con la variedad ordenada numéricamente, un compresor IDEAL podría ahorrar 18488874 bits. Tus datos ocupan 63 bits cada uno (no 64), así que en total suman 63000000 bits. Con la compresión IDEAL salen 44511126 o 5563891 bytes. Como tú partes de 64 bits de mentirijillas y no 63 bits reales (jeje, te doy ventaja), el nivel de compresión máximo teórico cogiendo esos 64 bits por elemento sería del 30.5%. La compresión que muestra blosc en ese mismo ejemplo es del 23%. Confieso que es una hazaña reseñable e inesperada y que mientras hacía las cuentas estaba nervioso por que la "práctica" contradijese la "teoría" matemática inviolable. A fin de cuentas yo soy ingeniero, no matemático :-). > ?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). La clave del asunto es que los nodos de almacenaje no corren ningún código especial. Imagina montar un sistema así con nodos tontos, simples almacenes de datos sin capacidad para ejecutar ningún tipo de código. Sus únicas operaciones son: escribir un objeto, leer un objeto y listar los objetos que almacena (de forma muy lenta, por cierto). Supón que tus nodos de almacenamiento son cosas como Google Drive o Dropbox, con una latencia estratosférica e incapacidad total para ejecutar ningún código más alla de GET, PUT, REMOVE o LIST. Los almacenes están completamente descoordinados y son TONTOS. Lo que yo tengo montado es la inteligencia que hay por encima que permite localizar y operar con los objetos A PESAR de que el almacenaje final no coopera. También la replicación y la verificación de la integridad de todo el sistema. Este proyecto tiene unos objetivos muy concretos. No pretende competir con sistemas de almacenamiento distribuidos donde tienes el lujo de ejecutar código en la máquina que te da el almacenamiento. En mi caso yo no puedo ni siquiera confiar en que el almacenamiento no me mienta descaradamente, como para entregarle alguna responsabilidad en la gestión del sistema... Mi sistema lleva funcionando años con una excelente trayectoria. A medida que crece el espacio de almacenaje hay que evolucionar los algoritmos. No por un tema específicamente de velocidad, que es buena ahora mismo cuando no paginas, sino porque a medida que los índices crecen y ocupan más, acabas paginando. El cambio a "cuckoo hashes" reduciría mis necesidades de memoria respecto a la versión actual del sistema a un tercio, aproximadamente. Es decir, con los recursos actuales, puedo triplicar mi tamaño hasta volver a tropezarme con el problema que empiezo a rozar ahora: paginar. Ahora mismo estoy empezando a paginar en algunos momentos. Durante esos "eventos", el rendimiento del sistema se va al garete y el problema persiste durante dos o tres minutos por "evento". Reduciendo mis necesidades de memoria a un tercio, puedo triplicar mi tamaño hasta que vuelva a encontrarme en el mismo punto que estoy ahora, donde la paginación "está empezando a molestar" (pero aún no es grave y supone solo molestias esporádicas). Con mi ritmo de crecimiento de los últimos años, esto me da unos dos o tres años de vida, tiempo suficiente para un cambio tecnológico, para que el proyecto se vuelva irrelevante o para una rearquitectura. En realidad, hay muchas vías de escape, estoy lejos de tropezarme con un muro insalvable. Un "cuckoo hash" es un proyecto de dos tardes a cambio de dos o tres años de relax. Lo que estoy intentando es ver si algún compañero conoce un algoritmo mejor para invertir en él cinco tardes a cambio de la salvación eterna :-p Conozco Celph. De hecho uno de los nodos de almacenamiento de los que hablo corre Celph por debajo, pero no puedo permitirme el lujo de aprovecharme de ello. Ahora dime también cuánta memoria necesitas en el directorio CELPH para mapear cien millones de objetos. No me cabe en mi Raspberry PI con un gigabyte de RAM compartida con otros demonios :). Esta discusión está siendo muy interesante, Francesc. Sigamos :-). Centrémonos en la parte de acceso mínimo a páginas, ya que la parte de compresión es un dead-end en este caso concreto. Tengo blosc en mi arsenal para otros proyectos, puedes estar seguro de ello. Situación actual: con un cuckoo hash solo necesito el acceso a dos páginas de memoria en el peor de los casos, por cada "lookup". El tiempo de generación de los cuckoo hash es bastante irrelevante y se hace offline, no en cada escritura de objetos. Me da igual que tarde 15 horas. Básicamente el terabyte de objetos más recientes se gestiona de otra manera diferente, que no describo en estos emails, el cuckoo hash es solo para los petabytes "fríos". El objetivo es batir esas dos páginas de memoria por "lookup". ¿Ideas?. -- Jesús Cea Avión _/_/ _/_/_/ _/_/_/ jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ jabber / xmpp:jcea en 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 ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: OpenPGP digital signature URL: From jcea en jcea.es Mon Nov 27 17:46:09 2017 From: jcea en jcea.es (Jesus Cea) Date: Mon, 27 Nov 2017 23:46:09 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> Message-ID: On 27/11/17 21:38, Francesc Alted wrote: > 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'. ? Lo cierto es que puedes comprobarlo tú mismo: >>> hashes = [sha256(b'%d' % i).digest() for i in range(256000)] >>> hashes.sort() # Ordeno los hashes >>> b=blosc.compress(b''.join(hashes), typesize=32) >>> len(b) 8045911 >>> 100*(1-8045911/(256000*32)) 1.7833129882812493 1.78%. Clava a mis resultados con datos reales: > Para quedarnos todos tranquilos, voy a ver mi caso real: [...]> 1.7785873168091881 > > La compresión es del 1.78%. -- Jesús Cea Avión _/_/ _/_/_/ _/_/_/ jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ jabber / xmpp:jcea en 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 ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: OpenPGP digital signature URL: From jcea en jcea.es Mon Nov 27 18:04:10 2017 From: jcea en jcea.es (Jesus Cea) Date: Tue, 28 Nov 2017 00:04:10 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> Message-ID: <2c85c36e-85a0-f07b-8bde-17aefa6758e3@jcea.es> On 27/11/17 21:38, Francesc Alted wrote: >  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'. ? Ordeno los hashes de los bloques que tiene cada nodo. Esto tiene la ventaja de que puedo hacer un MMAP de ese fichero y hacer un LOOKUP directo mediante bisección. El problema de eso es que con 2000 páginas por fichero, tengo que hacer 11 accesos a páginas diferentes. Los primeros niveles muy posiblemente estén cacheados en RAM, pero los niveles inferiores son aleatorios y poco cacheables. Muy lejos de los dos accesos a páginas que me da un "cuckoo hash". Otra ventajas de tener una lista ordenada de hashes es que operaciones como la unión, la resta de conjuntos o la intersección son muy sencillos y eficientes. Me basta con revisar un único elemento de cada conjunto y, encima, en streaming secuencial. Eso les encanta a las cachés de la CPU :-). Pasar eso a un "cuckoo hash" supone que, por ejemplo, una intersección, una resta o una unión de conjuntos requieres dos accesos secuenciales y un acceso aleatorio (en vez de dos accesos secuenciales). El acceso aleatorio es costoso pero tolerable, y los "lookups" pasan de requerir once accesos a páginas diferentes a requerir dos como mucho. La complejidad en sí del algoritmo es pequeña. La pregunta es... ¿Se puede hacer mejor? -- Jesús Cea Avión _/_/ _/_/_/ _/_/_/ jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ jabber / xmpp:jcea en 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 ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 473 bytes Desc: OpenPGP digital signature URL: From faltet en gmail.com Tue Nov 28 03:01:49 2017 From: faltet en gmail.com (Francesc Alted) Date: Tue, 28 Nov 2017 09:01:49 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: <17b40d06-c6f8-d59c-8fd2-2aebe7264dce@jcea.es> References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> <17b40d06-c6f8-d59c-8fd2-2aebe7264dce@jcea.es> Message-ID: 2017-11-27 23:37 GMT+01:00 Jesus Cea : > On 27/11/17 21:38, Francesc Alted wrote: > > 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) > > Estás usando 63 bits, no 64, pero vale :-) > ?Bueno, la verdad es que confieso que mientras estaba intentando los 64 me encontré con: In [8]: b = np.random.randint(2**64, size=1000*1000) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in () ----> 1 b = np.random.randint(2**64, size=1000*1000) mtrand.pyx in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:16123)() ValueError: high is out of bounds for int64 y me dije "bah, probablemente Jesús me va a perdonar 1 bit" :)? > > Ordenar mejora la compresión porque estamos reduciendo la entropía de > los datos. En mi caso, si tengo 256000 valores diferentes, podrían > ordenarse de 256000! maneras, un número de 1.4 millones de dígitos. Si > de todas esas posibilidades me quedo exclusivamente con la versión > ordenada numéricamente, me ahorro (por entropía) unos 4229911 bits > (aproximación de Stirling del factorial). Es decir, un compresor > perfecto comprimiría mis 8192000 bytes perfectamente aleatorios a > 7663261 bytes. Una compresión teórica máxima del 6.45%. Si los datos son > verdaderamente aleatorios y la única estructura que tenemos es que están > ordenados, no podemos comprimir más que un 6.45%. Salvo error matemático > por mi parte. (considerando 256000 valores de 256 bits aleatorios). > > Por tanto, insisto nuevamente, me centraría en buscar una estructura de > datos que acceda al mínimo posible de páginas de RAM, no en comprimir, > porque por la parte de compresión estoy limitado al 6.45% de un > compresor ideal que no existe. > > Usemos la fórmula para analizar tu ejemplo. Un millón de valores son > 1e6! de combinaciones de ordenación. Si me quedo solo con la variedad > ordenada numéricamente, un compresor IDEAL podría ahorrar 18488874 bits. > Tus datos ocupan 63 bits cada uno (no 64), así que en total suman > 63000000 bits. Con la compresión IDEAL salen 44511126 o 5563891 bytes. > Como tú partes de 64 bits de mentirijillas y no 63 bits reales (jeje, te > doy ventaja), el nivel de compresión máximo teórico cogiendo esos 64 > bits por elemento sería del 30.5%. > ?Buena estimación. Para ver que pasa con 64 bits he hecho la prueba fetén: In [25]: b = np.random.randint(2**64, size=1000*1000, dtype=np.uint64) In [26]: b.sort() In [27]: %time len(blosc.compress(b)) CPU times: user 26.3 ms, sys: 0 ns, total: 26.3 ms Wall time: 6.9 ms Out[27]: 6324530 Lo cual nos deja la compresión en un ?21% (no 23% de 63 bits). Usando el codec más potente en blosc, el ztsd: In [28]: %time len(blosc.compress(b, cname="zstd")) CPU times: user 1.09 s, sys: 0 ns, total: 1.09 s Wall time: 290 ms Out[28]: 6050011 que representa el 25% de compresión (supongo que muy cerca del límite teórico). > > La compresión que muestra blosc en ese mismo ejemplo es del 23%. > Confieso que es una hazaña reseñable e inesperada y que mientras hacía > las cuentas estaba nervioso por que la "práctica" contradijese la > "teoría" matemática inviolable. A fin de cuentas yo soy ingeniero, no > matemático :-). > ?Bueno, mientras no se supere el límite teórico no hay ninguna 'hazaña' reseñable ;)? > > > ?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). > > La clave del asunto es que los nodos de almacenaje no corren ningún > código especial. Imagina montar un sistema así con nodos tontos, simples > almacenes de datos sin capacidad para ejecutar ningún tipo de código. > Sus únicas operaciones son: escribir un objeto, leer un objeto y listar > los objetos que almacena (de forma muy lenta, por cierto). Supón que tus > nodos de almacenamiento son cosas como Google Drive o Dropbox, con una > latencia estratosférica e incapacidad total para ejecutar ningún código > más alla de GET, PUT, REMOVE o LIST. > > Los almacenes están completamente descoordinados y son TONTOS. Lo que yo > tengo montado es la inteligencia que hay por encima que permite > localizar y operar con los objetos A PESAR de que el almacenaje final no > coopera. También la replicación y la verificación de la integridad de > todo el sistema. > > Este proyecto tiene unos objetivos muy concretos. No pretende competir > con sistemas de almacenamiento distribuidos donde tienes el lujo de > ejecutar código en la máquina que te da el almacenamiento. En mi caso yo > no puedo ni siquiera confiar en que el almacenamiento no me mienta > descaradamente, como para entregarle alguna responsabilidad en la > gestión del sistema... > > Mi sistema lleva funcionando años con una excelente trayectoria. A > medida que crece el espacio de almacenaje hay que evolucionar los > algoritmos. No por un tema específicamente de velocidad, que es buena > ahora mismo cuando no paginas, sino porque a medida que los índices > crecen y ocupan más, acabas paginando. El cambio a "cuckoo hashes" > reduciría mis necesidades de memoria respecto a la versión actual del > sistema a un tercio, aproximadamente. Es decir, con los recursos > actuales, puedo triplicar mi tamaño hasta volver a tropezarme con el > problema que empiezo a rozar ahora: paginar. > > Ahora mismo estoy empezando a paginar en algunos momentos. Durante esos > "eventos", el rendimiento del sistema se va al garete y el problema > persiste durante dos o tres minutos por "evento". Reduciendo mis > necesidades de memoria a un tercio, puedo triplicar mi tamaño hasta que > vuelva a encontrarme en el mismo punto que estoy ahora, donde la > paginación "está empezando a molestar" (pero aún no es grave y supone > solo molestias esporádicas). > > Con mi ritmo de crecimiento de los últimos años, esto me da unos dos o > tres años de vida, tiempo suficiente para un cambio tecnológico, para > que el proyecto se vuelva irrelevante o para una rearquitectura. > > En realidad, hay muchas vías de escape, estoy lejos de tropezarme con un > muro insalvable. Un "cuckoo hash" es un proyecto de dos tardes a cambio > de dos o tres años de relax. Lo que estoy intentando es ver si algún > compañero conoce un algoritmo mejor para invertir en él cinco tardes a > cambio de la salvación eterna :-p > > Conozco Celph. De hecho uno de los nodos de almacenamiento de los que > hablo corre Celph por debajo, pero no puedo permitirme el lujo de > aprovecharme de ello. Ahora dime también cuánta memoria necesitas en el > directorio CELPH para mapear cien millones de objetos. No me cabe en mi > Raspberry PI con un gigabyte de RAM compartida con otros demonios :). > > Esta discusión está siendo muy interesante, Francesc. Sigamos :-). > > Centrémonos en la parte de acceso mínimo a páginas, ya que la parte de > compresión es un dead-end en este caso concreto. Tengo blosc en mi > arsenal para otros proyectos, puedes estar seguro de ello. > > Situación actual: con un cuckoo hash solo necesito el acceso a dos > páginas de memoria en el peor de los casos, por cada "lookup". El tiempo > de generación de los cuckoo hash es bastante irrelevante y se hace > offline, no en cada escritura de objetos. Me da igual que tarde 15 > horas. Básicamente el terabyte de objetos más recientes se gestiona de > otra manera diferente, que no describo en estos emails, el cuckoo hash > es solo para los petabytes "fríos". > ?Vale, ahora ya veo tu caso de uso con más claridad. La verdad es que me interesa mucho tu proyecto; si lo tienes en abierto? nos podrías decir dónde está? Me gustaría 'jugar' un poco :) Francesc > > El objetivo es batir esas dos páginas de memoria por "lookup". ¿Ideas?. > > -- > Jesús Cea Avión _/_/ _/_/_/ _/_/_/ > jcea en jcea.es - http://www.jcea.es/ _/_/ _/_/ _/_/ _/_/ _/_/ > Twitter: @jcea _/_/ _/_/ _/_/_/_/_/ > jabber / xmpp:jcea en 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 en python.org > https://mail.python.org/mailman/listinfo/python-es > > -- Francesc Alted ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lasizoillo en gmail.com Tue Nov 28 05:29:39 2017 From: lasizoillo en gmail.com (lasizoillo) Date: Tue, 28 Nov 2017 11:29:39 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: <17b40d06-c6f8-d59c-8fd2-2aebe7264dce@jcea.es> References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> <17b40d06-c6f8-d59c-8fd2-2aebe7264dce@jcea.es> Message-ID: El 27 de noviembre de 2017, 23:37, Jesus Cea escribió: > > > El objetivo es batir esas dos páginas de memoria por "lookup". ¿Ideas?. > > Probablemente diga una barbaridad, pero por si acaso no lo es la digo ;-) https://www.kernel.org/doc/Documentation/vm/transhuge.txt Si el tema es evitar los accesos a páginas de memoria porque se producen cache-miss en la tabla que mapea la memoria virtual con la física está la posibilidad de aumentar los tamaños de las páginas de memoria. No es gratis y no está exento de problemas, pero bajamdo al nivel que te gusta bajar es posible que te sirva de ayuda. No entro en la parte de la algorítmica porque parece que la tienes atada y no me ha dado tiempo a profundizar. De lo poco que he tenido tiempo de leer sobre el cuckoo hashing he visto que hablaban sobre límites de ocupación del hash ¿Puede ser eso problemático? Gracias a los dos por el hilo, está siendo un auténtico placer leeros. Un abrazo, Javi ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kikocorreoso en gmail.com Tue Nov 28 05:52:17 2017 From: kikocorreoso en gmail.com (Kiko) Date: Tue, 28 Nov 2017 11:52:17 +0100 Subject: [Python-es] =?utf-8?q?=C2=BFPropuesta_de_algoritmo_o_estructura_?= =?utf-8?q?de_datos_para_conjuntos_aleatorios_con_pocos_cambios=3F?= In-Reply-To: References: <179d2c9f-4995-390d-f8d5-7212a845e924@jcea.es> <4fc11b67-2900-17f8-9bc8-e04ed28a386d@jcea.es> <4b752cb0-23e3-82c4-a34b-4c6d56c8989b@jcea.es> <17b40d06-c6f8-d59c-8fd2-2aebe7264dce@jcea.es> Message-ID: El 28 de noviembre de 2017, 11:29, lasizoillo escribió: > > > El 27 de noviembre de 2017, 23:37, Jesus Cea escribió: > >> >> >> El objetivo es batir esas dos páginas de memoria por "lookup". ¿Ideas?. >> >> > Probablemente diga una barbaridad, pero por si acaso no lo es la digo ;-) > > https://www.kernel.org/doc/Documentation/vm/transhuge.txt > > Si el tema es evitar los accesos a páginas de memoria porque se producen > cache-miss en la tabla que mapea la memoria virtual con la física está la > posibilidad de aumentar los tamaños de las páginas de memoria. No es gratis > y no está exento de problemas, pero bajamdo al nivel que te gusta bajar es > posible que te sirva de ayuda. > > No entro en la parte de la algorítmica porque parece que la tienes atada y > no me ha dado tiempo a profundizar. De lo poco que he tenido tiempo de leer > sobre el cuckoo hashing he visto que hablaban sobre límites de ocupación > del hash ¿Puede ser eso problemático? > > Gracias a los dos por el hilo, está siendo un auténtico placer leeros. > +1 (desde la sombra de la ignorancia) > > Un abrazo, > > Javi > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From turriano en gmail.com Tue Nov 28 09:31:19 2017 From: turriano en gmail.com (Turriano) Date: Tue, 28 Nov 2017 15:31:19 +0100 Subject: [Python-es] Boa Constructor en Puppy Linux Message-ID: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Hola amigos de Python. Estoy intentando usar Boa Constructor en Puppy Linux y aunque he instalado el paquete y me dice que "Sin dependencias" (que no necesito cargar nada más, vamos), al ejecutar éste no funciona. ¿Sabéis por qué podría ser?. ¿Alguien que use esa distribución o cualquier otra de Linux, sabe como se podría resolver desde consola?. Gracias a todos por leerme. --- El software de antivirus Avast ha analizado este correo electrónico en busca de virus. https://www.avast.com/antivirus From rmatarria en gmail.com Thu Nov 23 21:12:02 2017 From: rmatarria en gmail.com (Roberto Matarrita) Date: Thu, 23 Nov 2017 20:12:02 -0600 Subject: [Python-es] =?utf-8?q?Utilizaci=C3=B3n_de_JasperReport=2E?= Message-ID: Buenas noches grupo. Quisiera saber si alguien ha utilizado JasperReport con Pytho, en aplicaciones de escritorio. Tengo un pequeño ejemplo de como imprimir, logré hacerlo funcionar, pero el problema que tengo son dos. 1. Cómo imprimir el reporte en pantalla, antes de grabarlo a disco, ya que el ejemplo que tengo lo imprime directamente en el disco. 1. Cómo puedo hacer para enviarle parámetros al reporte, por ejemplo número de compañía, número de factura. Acá dejo el código y mucho agradecería la ayuda. Atentamente: Roberto. import sys import os import pyjasper from platform import python_version from pyjasper.jasperpy import JasperPy #def advanced_example_using_database(): input_file = os.path.dirname(os.path.abspath(__file__)) + '/report4.jrxml' output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' print(input_file) print(output) con = { 'driver': 'postgres', 'username': 'postgres', 'password': 'Administra8080', 'host': 'localhost', 'database': 'municipal', 'port':'5432' } jasper = JasperPy() jasper.process(input_file,output_file=output,format_list=["pdf"],db_connection=con) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From elena.counago en gmail.com Tue Nov 28 04:30:46 2017 From: elena.counago en gmail.com (=?UTF-8?Q?Elena_Cou=C3=B1ago_S=C3=A1nchez?=) Date: Tue, 28 Nov 2017 10:30:46 +0100 Subject: [Python-es] Oferta empleo CETMAR-Vigo Message-ID: Oferta de empleo para Licenciatura en Físicas; Matemáticas; Informática; Enxeñeiro Superior en: Telecomunicacións; Informática Industrial; Grado en: Enxeñería Industrial; Telecomunicacións; Enxeñería Informática, para proyecto CIVILUAV INNICIATIVE. Duración prevista: 9 meses Más info en: http://www.cetmar.org/ofertas-de-trabajo/ Saludos! Elena Couñago Sánchez ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kikocorreoso en gmail.com Tue Nov 28 11:00:34 2017 From: kikocorreoso en gmail.com (Kiko) Date: Tue, 28 Nov 2017 17:00:34 +0100 Subject: [Python-es] Boa Constructor en Puppy Linux In-Reply-To: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> References: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Message-ID: El 28 de noviembre de 2017, 15:31, Turriano escribió: > Hola amigos de Python. > Estoy intentando usar Boa Constructor en Puppy Linux y aunque he instalado > el paquete y me dice que "Sin dependencias" (que no necesito cargar nada > más, vamos), al ejecutar éste no funciona. > ¿Sabéis por qué podría ser?. > ¿Alguien que use esa distribución o cualquier otra de Linux, sabe como se > podría resolver desde consola?. > Gracias a todos por leerme. > > Boa Constructor parece un proyecto muerto desde hace unos cuantos años y no parece compatible con CPython 3.x. Si aun así lo quieres seguir usando: -¿Cómo lo has instalado? -¿Qué versión has instalado? -¿Qué haces para saber que no está funcionando? -¿Qué Puppy tienes instalado? -¿Qué Python usa? -¿Tienes instalado WxWindows, WxPython? -... > > --- > El software de antivirus Avast ha analizado este correo electrónico en > busca de virus. > https://www.avast.com/antivirus > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From mlacunza en gmail.com Tue Nov 28 11:47:52 2017 From: mlacunza en gmail.com (Mario Lacunza) Date: Tue, 28 Nov 2017 11:47:52 -0500 Subject: [Python-es] Boa Constructor en Puppy Linux In-Reply-To: References: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Message-ID: Hace tiempo el proyecto fue revivido no tengo el link a mano pero Google es tu amigo Enviado desde mi celular LG El 28 nov. 2017 11:01, "Kiko" escribió: > > > El 28 de noviembre de 2017, 15:31, Turriano escribió: > >> Hola amigos de Python. >> Estoy intentando usar Boa Constructor en Puppy Linux y aunque he >> instalado el paquete y me dice que "Sin dependencias" (que no necesito >> cargar nada más, vamos), al ejecutar éste no funciona. >> ¿Sabéis por qué podría ser?. >> ¿Alguien que use esa distribución o cualquier otra de Linux, sabe como se >> podría resolver desde consola?. >> Gracias a todos por leerme. >> >> Boa Constructor parece un proyecto muerto desde hace unos cuantos años y > no parece compatible con CPython 3.x. > > Si aun así lo quieres seguir usando: > > -¿Cómo lo has instalado? > -¿Qué versión has instalado? > -¿Qué haces para saber que no está funcionando? > -¿Qué Puppy tienes instalado? > -¿Qué Python usa? > -¿Tienes instalado WxWindows, WxPython? > -... > > >> >> --- >> El software de antivirus Avast ha analizado este correo electrónico en >> busca de virus. >> https://www.avast.com/antivirus >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kpiorno en uci.cu Tue Nov 28 11:51:43 2017 From: kpiorno en uci.cu (Karel Piorno Charchabal) Date: Tue, 28 Nov 2017 11:51:43 -0500 (CST) Subject: [Python-es] kivy en 3d In-Reply-To: References: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Message-ID: <914103109.8661952.1511887903981.JavaMail.zimbra@uci.cu> Hola grupo. Para aquellos amantes de Kivy https://kivy.org/ les comparto una biblioteca 3d que llevo tiempo desarrollado, la que permite además proyectar la interfaz 2D de Kivy en una malla 3D y poder interectuar con el resultado. Es kivy3dgui: https://github.com/kpiorno/kivy3dgui Saludos La @universidad_uci es Fidel: 15 años conectados al futuro... conectados a la Revolución 2002-2017 ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From felix.listadebian en gmail.com Tue Nov 28 12:45:25 2017 From: felix.listadebian en gmail.com (Felix Perez) Date: Tue, 28 Nov 2017 14:45:25 -0300 Subject: [Python-es] Boa Constructor en Puppy Linux In-Reply-To: References: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Message-ID: El 28 de noviembre de 2017, 13:47, Mario Lacunza escribió: > Hace tiempo el proyecto fue revivido no tengo el link a mano pero Google es > tu amigo > Sería interesante saber donde lo leiste o como buscaste, he tratado de buscar y no obtengo ningún resultado o noticia que haga referencia a lo que dices. Gracias. > Enviado desde mi celular LG > > El 28 nov. 2017 11:01, "Kiko" escribió: >> >> >> >> El 28 de noviembre de 2017, 15:31, Turriano escribió: >>> >>> Hola amigos de Python. >>> Estoy intentando usar Boa Constructor en Puppy Linux y aunque he >>> instalado el paquete y me dice que "Sin dependencias" (que no necesito >>> cargar nada más, vamos), al ejecutar éste no funciona. >>> ¿Sabéis por qué podría ser?. >>> ¿Alguien que use esa distribución o cualquier otra de Linux, sabe como se >>> podría resolver desde consola?. >>> Gracias a todos por leerme. >>> >> Boa Constructor parece un proyecto muerto desde hace unos cuantos años y >> no parece compatible con CPython 3.x. >> >> Si aun así lo quieres seguir usando: >> >> -¿Cómo lo has instalado? >> -¿Qué versión has instalado? >> -¿Qué haces para saber que no está funcionando? >> -¿Qué Puppy tienes instalado? >> -¿Qué Python usa? >> -¿Tienes instalado WxWindows, WxPython? >> -... >> >>> >>> >>> --- >>> El software de antivirus Avast ha analizado este correo electrónico en >>> busca de virus. >>> https://www.avast.com/antivirus >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- usuario linux #274354 normas de la lista: http://wiki.debian.org/es/NormasLista como hacer preguntas inteligentes: http://www.sindominio.net/ayuda/preguntas-inteligentes.html From mlacunza en gmail.com Tue Nov 28 16:11:36 2017 From: mlacunza en gmail.com (Mario Lacunza) Date: Tue, 28 Nov 2017 16:11:36 -0500 Subject: [Python-es] Boa Constructor en Puppy Linux In-Reply-To: References: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Message-ID: Una búsqueda simple lo hace por: boa constructor fork El segundo resultado (cwt) es lo que buscas. Enviado desde mi celular LG El 28 nov. 2017 12:47, "Felix Perez" escribió: > El 28 de noviembre de 2017, 13:47, Mario Lacunza > escribió: > > Hace tiempo el proyecto fue revivido no tengo el link a mano pero Google > es > > tu amigo > > > > Sería interesante saber donde lo leiste o como buscaste, he tratado de > buscar y no obtengo ningún resultado o noticia que haga referencia a > lo que dices. > Gracias. > > > Enviado desde mi celular LG > > > > El 28 nov. 2017 11:01, "Kiko" escribió: > >> > >> > >> > >> El 28 de noviembre de 2017, 15:31, Turriano > escribió: > >>> > >>> Hola amigos de Python. > >>> Estoy intentando usar Boa Constructor en Puppy Linux y aunque he > >>> instalado el paquete y me dice que "Sin dependencias" (que no necesito > >>> cargar nada más, vamos), al ejecutar éste no funciona. > >>> ¿Sabéis por qué podría ser?. > >>> ¿Alguien que use esa distribución o cualquier otra de Linux, sabe como > se > >>> podría resolver desde consola?. > >>> Gracias a todos por leerme. > >>> > >> Boa Constructor parece un proyecto muerto desde hace unos cuantos años y > >> no parece compatible con CPython 3.x. > >> > >> Si aun así lo quieres seguir usando: > >> > >> -¿Cómo lo has instalado? > >> -¿Qué versión has instalado? > >> -¿Qué haces para saber que no está funcionando? > >> -¿Qué Puppy tienes instalado? > >> -¿Qué Python usa? > >> -¿Tienes instalado WxWindows, WxPython? > >> -... > >> > >>> > >>> > >>> --- > >>> El software de antivirus Avast ha analizado este correo electrónico en > >>> busca de virus. > >>> https://www.avast.com/antivirus > >>> > >>> _______________________________________________ > >>> Python-es mailing list > >>> Python-es en python.org > >>> https://mail.python.org/mailman/listinfo/python-es > >> > >> > >> > >> _______________________________________________ > >> Python-es mailing list > >> Python-es en python.org > >> https://mail.python.org/mailman/listinfo/python-es > >> > > > > _______________________________________________ > > Python-es mailing list > > Python-es en python.org > > https://mail.python.org/mailman/listinfo/python-es > > > > > > -- > usuario linux #274354 > normas de la lista: http://wiki.debian.org/es/NormasLista > como hacer preguntas inteligentes: > http://www.sindominio.net/ayuda/preguntas-inteligentes.html > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From felix.listadebian en gmail.com Tue Nov 28 16:35:30 2017 From: felix.listadebian en gmail.com (Felix Perez) Date: Tue, 28 Nov 2017 18:35:30 -0300 Subject: [Python-es] Boa Constructor en Puppy Linux In-Reply-To: References: <4ced0603-03fa-e63b-4611-40be3a8df4e0@gmail.com> Message-ID: El 28 de noviembre de 2017, 18:11, Mario Lacunza escribió: > Una búsqueda simple lo hace por: boa constructor fork > > El segundo resultado (cwt) es lo que buscas. Jajajaja, gracias lo pensé pero no lo busqué como un fork. Gracias nuevamente. > > Enviado desde mi celular LG > > El 28 nov. 2017 12:47, "Felix Perez" escribió: >> >> El 28 de noviembre de 2017, 13:47, Mario Lacunza >> escribió: >> > Hace tiempo el proyecto fue revivido no tengo el link a mano pero Google >> > es >> > tu amigo >> > >> >> Sería interesante saber donde lo leiste o como buscaste, he tratado de >> buscar y no obtengo ningún resultado o noticia que haga referencia a >> lo que dices. >> Gracias. >> >> > Enviado desde mi celular LG >> > >> > El 28 nov. 2017 11:01, "Kiko" escribió: >> >> >> >> >> >> >> >> El 28 de noviembre de 2017, 15:31, Turriano >> >> escribió: >> >>> >> >>> Hola amigos de Python. >> >>> Estoy intentando usar Boa Constructor en Puppy Linux y aunque he >> >>> instalado el paquete y me dice que "Sin dependencias" (que no necesito >> >>> cargar nada más, vamos), al ejecutar éste no funciona. >> >>> ¿Sabéis por qué podría ser?. >> >>> ¿Alguien que use esa distribución o cualquier otra de Linux, sabe como >> >>> se >> >>> podría resolver desde consola?. >> >>> Gracias a todos por leerme. >> >>> >> >> Boa Constructor parece un proyecto muerto desde hace unos cuantos años >> >> y >> >> no parece compatible con CPython 3.x. >> >> >> >> Si aun así lo quieres seguir usando: >> >> >> >> -¿Cómo lo has instalado? >> >> -¿Qué versión has instalado? >> >> -¿Qué haces para saber que no está funcionando? >> >> -¿Qué Puppy tienes instalado? >> >> -¿Qué Python usa? >> >> -¿Tienes instalado WxWindows, WxPython? >> >> -... >> >> >> >>> >> >>> >> >>> --- >> >>> El software de antivirus Avast ha analizado este correo electrónico en >> >>> busca de virus. >> >>> https://www.avast.com/antivirus >> >>> >> >>> _______________________________________________ >> >>> Python-es mailing list >> >>> Python-es en python.org >> >>> https://mail.python.org/mailman/listinfo/python-es >> >> >> >> >> >> >> >> _______________________________________________ >> >> Python-es mailing list >> >> Python-es en python.org >> >> https://mail.python.org/mailman/listinfo/python-es >> >> >> > >> > _______________________________________________ >> > Python-es mailing list >> > Python-es en python.org >> > https://mail.python.org/mailman/listinfo/python-es >> > >> >> >> >> -- >> usuario linux #274354 >> normas de la lista: http://wiki.debian.org/es/NormasLista >> como hacer preguntas inteligentes: >> http://www.sindominio.net/ayuda/preguntas-inteligentes.html >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- usuario linux #274354 normas de la lista: http://wiki.debian.org/es/NormasLista como hacer preguntas inteligentes: http://www.sindominio.net/ayuda/preguntas-inteligentes.html From rmatarria en gmail.com Tue Nov 28 22:21:25 2017 From: rmatarria en gmail.com (Roberto Matarrita) Date: Tue, 28 Nov 2017 21:21:25 -0600 Subject: [Python-es] Como Implementar Python y JasperReport. Message-ID: Buenas noches. Ya llevo varios meses tratando de aprender a realizar reportes en Python. He buscado reporteadores, documentación respecto al tema, pero al parecer es bastante escasa. Vi reportlab, pandas y otros, pero todos son para confeccionar a puro código. Observé un par de reporeteadores gráficos, entre ellos JasperReport, muy bueno y completo. Me enviaron el código que abajo describo, el cual logré que funcionara, se conecta a la base de datos, envía parámetros y hace el reporte. Pero tengo el gran problema que no he podido ya que desconozco como hacerlo y la persona que me envió el código, tampoco ha podido ayudarme y es como hacer para ver el reporte en pantalla. Es decir un preview. Es decir como hago para ver el reporte en la pantalla, para que el usuakrio escoja la impresora, o bien si lo va a enviar a un PDF, Word o Excel. Ya que el código lo que hace es grabar directamente el reporte al disco. Mucho agradecería la ayuda, o bien sujerencias para los reportes ya que estoy en un proyecto muy grande y este ha sido el talón de aquiles en Python, los reportes. Si alguien conoce del tema. Gracias. Describo el código. import sys import os import PyPDF2 import pyjasper from platform import python_version from pyjasper.jasperpy import JasperPy from PyPDF2 import PdfFileMerger,PdfFileReader #def advanced_example_using_database(): input_file = os.path.dirname(os.path.abspath(__file__)) + '/report4.jrxml' output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' print(input_file) print(output) con = { 'driver': 'postgres', 'username': 'postgres', 'password': 'Administra8080', 'host': 'localhost', 'database': 'municipal', 'port':'5432' } x=input("Digite codigo de empleado :") jasper = JasperPy() jasper.process(input_file,output_file=output,format_list=["pdf"], parameters={'idenifica': (x)},db_connection=con) #Aquí se confecciona el reporte. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nimbiotics en gmail.com Wed Nov 29 11:38:55 2017 From: nimbiotics en gmail.com (Mario R. Osorio) Date: Wed, 29 Nov 2017 11:38:55 -0500 Subject: [Python-es] Como Implementar Python y JasperReport. In-Reply-To: References: Message-ID: Desconozco el producto JasperReport. Sin embargo, si ya tienes el archivo PDF, solo te falta abrirlo, y hay varias formas de hacerlo; entre ellas: - - subprocess.Popen([file],shell=True) - import webbrowser webbrowser.open_new(r'file://C:\path\to\file.pdf') - import os os.startfile(filename) - os.system(filename) - Tambien podrias hacer uso de varias librerias para manipulacion de archivos PDF Dtb/Gby ======= Mario R. Osorio A.S. of Computer Programming and Analysis Web page: *http;//mario.osorio.solutions * Email: *mario en osorio.solutions* *Just Choose Python!* ?If I had asked people what they wanted, they would have said faster horses.? ? Henry Ford 2017-11-28 22:21 GMT-05:00 Roberto Matarrita : > Buenas noches. Ya llevo varios meses tratando de aprender a realizar > reportes en Python. He buscado reporteadores, documentación respecto al > tema, pero al parecer es bastante escasa. Vi reportlab, pandas y otros, > pero todos son para confeccionar a puro código. Observé un par de > reporeteadores gráficos, entre ellos JasperReport, muy bueno y completo. > Me enviaron el código que abajo describo, el cual logré que funcionara, se > conecta a la base de datos, envía parámetros y hace el reporte. > Pero tengo el gran problema que no he podido ya que desconozco como > hacerlo y la persona que me envió el código, tampoco ha podido ayudarme y > es como hacer para ver el reporte en pantalla. Es decir un preview. > > Es decir como hago para ver el reporte en la pantalla, para que el > usuakrio escoja la impresora, o bien si lo va a enviar a un PDF, Word o > Excel. Ya que el código lo que hace es grabar directamente el reporte al > disco. > Mucho agradecería la ayuda, o bien sujerencias para los reportes ya que > estoy en un proyecto muy grande y este ha sido el talón de aquiles en > Python, los reportes. Si alguien conoce del tema. > > Gracias. > > Describo el código. > > import sys > import os > import PyPDF2 > import pyjasper > from platform import python_version > from pyjasper.jasperpy import JasperPy > from PyPDF2 import PdfFileMerger,PdfFileReader > > #def advanced_example_using_database(): > input_file = os.path.dirname(os.path.abspath(__file__)) + '/report4.jrxml' > output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' > print(input_file) > print(output) > > con = { > 'driver': 'postgres', > 'username': 'postgres', > 'password': 'Administra8080', > 'host': 'localhost', > 'database': 'municipal', > 'port':'5432' > } > x=input("Digite codigo de empleado :") > jasper = JasperPy() > jasper.process(input_file,output_file=output,format_list=["pdf"], > parameters={'idenifica': (x)},db_connection=con) #Aquí se confecciona el > reporte. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rmatarria en gmail.com Wed Nov 29 15:04:37 2017 From: rmatarria en gmail.com (Roberto Matarrita) Date: Wed, 29 Nov 2017 14:04:37 -0600 Subject: [Python-es] Como Implementar Python y JasperReport. In-Reply-To: References: Message-ID: Gracias Mario por el aporte. Voy a probar la ,información que me envió y cualquier problema se lo comunico. Gracias. Libre de virus. www.avast.com <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> El 29 de noviembre de 2017, 10:38, Mario R. Osorio escribió: > Desconozco el producto JasperReport. Sin embargo, si ya tienes el archivo > PDF, solo te falta abrirlo, y hay varias formas de hacerlo; entre ellas: > > > - > - subprocess.Popen([file],shell=True) > - > > import webbrowser > webbrowser.open_new(r'file://C:\path\to\file.pdf') > > - > > import os > os.startfile(filename) > > - > > os.system(filename) > > - > > > > > Tambien podrias hacer uso de varias librerias para manipulacion de > archivos PDF > > > Dtb/Gby > ======= > Mario R. Osorio > A.S. of Computer Programming and Analysis > Web page: *http;//mario.osorio.solutions > * > Email: *mario en osorio.solutions* > *Just Choose Python!* > > ?If I had asked people what they wanted, they would have said faster > horses.? > ? Henry Ford > > > > > > > > 2017-11-28 22:21 GMT-05:00 Roberto Matarrita : > >> Buenas noches. Ya llevo varios meses tratando de aprender a realizar >> reportes en Python. He buscado reporteadores, documentación respecto al >> tema, pero al parecer es bastante escasa. Vi reportlab, pandas y otros, >> pero todos son para confeccionar a puro código. Observé un par de >> reporeteadores gráficos, entre ellos JasperReport, muy bueno y completo. >> Me enviaron el código que abajo describo, el cual logré que funcionara, >> se conecta a la base de datos, envía parámetros y hace el reporte. >> Pero tengo el gran problema que no he podido ya que desconozco como >> hacerlo y la persona que me envió el código, tampoco ha podido ayudarme y >> es como hacer para ver el reporte en pantalla. Es decir un preview. >> >> Es decir como hago para ver el reporte en la pantalla, para que el >> usuakrio escoja la impresora, o bien si lo va a enviar a un PDF, Word o >> Excel. Ya que el código lo que hace es grabar directamente el reporte al >> disco. >> Mucho agradecería la ayuda, o bien sujerencias para los reportes ya que >> estoy en un proyecto muy grande y este ha sido el talón de aquiles en >> Python, los reportes. Si alguien conoce del tema. >> >> Gracias. >> >> Describo el código. >> >> import sys >> import os >> import PyPDF2 >> import pyjasper >> from platform import python_version >> from pyjasper.jasperpy import JasperPy >> from PyPDF2 import PdfFileMerger,PdfFileReader >> >> #def advanced_example_using_database(): >> input_file = os.path.dirname(os.path.abspath(__file__)) + >> '/report4.jrxml' >> output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' >> print(input_file) >> print(output) >> >> con = { >> 'driver': 'postgres', >> 'username': 'postgres', >> 'password': 'Administra8080', >> 'host': 'localhost', >> 'database': 'municipal', >> 'port':'5432' >> } >> x=input("Digite codigo de empleado :") >> jasper = JasperPy() >> jasper.process(input_file,output_file=output,format_list=["pdf"], >> parameters={'idenifica': (x)},db_connection=con) #Aquí se confecciona el >> reporte. >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rmatarria en gmail.com Wed Nov 29 17:45:56 2017 From: rmatarria en gmail.com (Roberto Matarrita) Date: Wed, 29 Nov 2017 16:45:56 -0600 Subject: [Python-es] Como Implementar Python y JasperReport. In-Reply-To: References: Message-ID: Don Mario, me funcionó el proceso, pude ver el reporte en la pantalla. Usted no sabe cuanto me ha costado hacer esto, llevo meses, buscando en Internet, documentación, gente que me dijera como podía hacer un reporte en python y realmente nadie me decía como hacerlos, a excepción de las herramientas que le mencioné. Gracias por ayudarme a dar el último paso que necesitaba para ver reportes en pantalla de una aplicación de escritorio. Ya los puedo tirar a PDF, Word,Excell,TXT y muchos otros formatos. Ahora es cuestión de afinarlo. 1. Una última consulta, usted como hace los reportes en python. 2. Que hace esta instrucción que me dio error y tuve que ponerla en comentario. subprocess.Popen([file],shell=True) Roberto. El 29 de noviembre de 2017, 10:38, Mario R. Osorio escribió: > Desconozco el producto JasperReport. Sin embargo, si ya tienes el archivo > PDF, solo te falta abrirlo, y hay varias formas de hacerlo; entre ellas: > > > - > - subprocess.Popen([file],shell=True) > - > > import webbrowser > webbrowser.open_new(r'file://C:\path\to\file.pdf') > > - > > import os > os.startfile(filename) > > - > > os.system(filename) > > - > > > > > Tambien podrias hacer uso de varias librerias para manipulacion de > archivos PDF > > > Dtb/Gby > ======= > Mario R. Osorio > A.S. of Computer Programming and Analysis > Web page: *http;//mario.osorio.solutions > * > Email: *mario en osorio.solutions* > *Just Choose Python!* > > ?If I had asked people what they wanted, they would have said faster > horses.? > ? Henry Ford > > > > > > > > 2017-11-28 22:21 GMT-05:00 Roberto Matarrita : > >> Buenas noches. Ya llevo varios meses tratando de aprender a realizar >> reportes en Python. He buscado reporteadores, documentación respecto al >> tema, pero al parecer es bastante escasa. Vi reportlab, pandas y otros, >> pero todos son para confeccionar a puro código. Observé un par de >> reporeteadores gráficos, entre ellos JasperReport, muy bueno y completo. >> Me enviaron el código que abajo describo, el cual logré que funcionara, >> se conecta a la base de datos, envía parámetros y hace el reporte. >> Pero tengo el gran problema que no he podido ya que desconozco como >> hacerlo y la persona que me envió el código, tampoco ha podido ayudarme y >> es como hacer para ver el reporte en pantalla. Es decir un preview. >> >> Es decir como hago para ver el reporte en la pantalla, para que el >> usuakrio escoja la impresora, o bien si lo va a enviar a un PDF, Word o >> Excel. Ya que el código lo que hace es grabar directamente el reporte al >> disco. >> Mucho agradecería la ayuda, o bien sujerencias para los reportes ya que >> estoy en un proyecto muy grande y este ha sido el talón de aquiles en >> Python, los reportes. Si alguien conoce del tema. >> >> Gracias. >> >> Describo el código. >> >> import sys >> import os >> import PyPDF2 >> import pyjasper >> from platform import python_version >> from pyjasper.jasperpy import JasperPy >> from PyPDF2 import PdfFileMerger,PdfFileReader >> >> #def advanced_example_using_database(): >> input_file = os.path.dirname(os.path.abspath(__file__)) + >> '/report4.jrxml' >> output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' >> print(input_file) >> print(output) >> >> con = { >> 'driver': 'postgres', >> 'username': 'postgres', >> 'password': 'Administra8080', >> 'host': 'localhost', >> 'database': 'municipal', >> 'port':'5432' >> } >> x=input("Digite codigo de empleado :") >> jasper = JasperPy() >> jasper.process(input_file,output_file=output,format_list=["pdf"], >> parameters={'idenifica': (x)},db_connection=con) #Aquí se confecciona el >> reporte. >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nimbiotics en gmail.com Wed Nov 29 19:23:23 2017 From: nimbiotics en gmail.com (Mario R. Osorio) Date: Wed, 29 Nov 2017 19:23:23 -0500 Subject: [Python-es] Como Implementar Python y JasperReport. In-Reply-To: References: Message-ID: Es para mi un placer poder ayudarte. Yo llevo varios años que no programo en Python, pero es mi lenguage favorito. La funcion popen() esta contenida en la libreria *subprocess* , asi que quizas solo te falte importar esa libreria. Te recomiendo que pruebes las varias formas de abrir el(los) arcchivo(s) ya que algunas podrian tener (d)efectos indeseados. *Tengo entendido* que la forma mas *correcta* es utilizando popen(), Pero yo pienso que lo *correcto*, a veces, esta en contraposicion a lo *desado*. Dtb/Gby ======= Mario R. Osorio A.S. of Computer Programming and Analysis Web page: *http;//mario.osorio.solutions * Email: *mario en osorio.solutions* *Just Choose Python!* ?If I had asked people what they wanted, they would have said faster horses.? ? Henry Ford 2017-11-29 17:45 GMT-05:00 Roberto Matarrita : > Don Mario, me funcionó el proceso, pude ver el reporte en la pantalla. > Usted no sabe cuanto me ha costado hacer esto, llevo meses, buscando en > Internet, documentación, gente que me dijera como podía hacer un reporte en > python y realmente nadie me decía como hacerlos, a excepción de las > herramientas que le mencioné. > > Gracias por ayudarme a dar el último paso que necesitaba para ver reportes > en pantalla de una aplicación de escritorio. Ya los puedo tirar a PDF, > Word,Excell,TXT y muchos otros formatos. Ahora es cuestión de afinarlo. > > 1. Una última consulta, usted como hace los reportes en python. > 2. Que hace esta instrucción que me dio error y tuve que ponerla en > comentario. subprocess.Popen([file],shell=True) > > > Roberto. > > El 29 de noviembre de 2017, 10:38, Mario R. Osorio > escribió: > >> Desconozco el producto JasperReport. Sin embargo, si ya tienes el archivo >> PDF, solo te falta abrirlo, y hay varias formas de hacerlo; entre ellas: >> >> >> - >> - subprocess.Popen([file],shell=True) >> - >> >> import webbrowser >> webbrowser.open_new(r'file://C:\path\to\file.pdf') >> >> - >> >> import os >> os.startfile(filename) >> >> - >> >> os.system(filename) >> >> - >> >> >> >> >> Tambien podrias hacer uso de varias librerias para manipulacion de >> archivos PDF >> >> >> Dtb/Gby >> ======= >> Mario R. Osorio >> A.S. of Computer Programming and Analysis >> Web page: *http;//mario.osorio.solutions >> * >> Email: *mario en osorio.solutions* >> *Just Choose Python!* >> >> ?If I had asked people what they wanted, they would have said faster >> horses.? >> ? Henry Ford >> >> >> >> >> >> >> >> 2017-11-28 22:21 GMT-05:00 Roberto Matarrita : >> >>> Buenas noches. Ya llevo varios meses tratando de aprender a realizar >>> reportes en Python. He buscado reporteadores, documentación respecto al >>> tema, pero al parecer es bastante escasa. Vi reportlab, pandas y otros, >>> pero todos son para confeccionar a puro código. Observé un par de >>> reporeteadores gráficos, entre ellos JasperReport, muy bueno y completo. >>> Me enviaron el código que abajo describo, el cual logré que funcionara, >>> se conecta a la base de datos, envía parámetros y hace el reporte. >>> Pero tengo el gran problema que no he podido ya que desconozco como >>> hacerlo y la persona que me envió el código, tampoco ha podido ayudarme y >>> es como hacer para ver el reporte en pantalla. Es decir un preview. >>> >>> Es decir como hago para ver el reporte en la pantalla, para que el >>> usuakrio escoja la impresora, o bien si lo va a enviar a un PDF, Word o >>> Excel. Ya que el código lo que hace es grabar directamente el reporte al >>> disco. >>> Mucho agradecería la ayuda, o bien sujerencias para los reportes ya que >>> estoy en un proyecto muy grande y este ha sido el talón de aquiles en >>> Python, los reportes. Si alguien conoce del tema. >>> >>> Gracias. >>> >>> Describo el código. >>> >>> import sys >>> import os >>> import PyPDF2 >>> import pyjasper >>> from platform import python_version >>> from pyjasper.jasperpy import JasperPy >>> from PyPDF2 import PdfFileMerger,PdfFileReader >>> >>> #def advanced_example_using_database(): >>> input_file = os.path.dirname(os.path.abspath(__file__)) + >>> '/report4.jrxml' >>> output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' >>> print(input_file) >>> print(output) >>> >>> con = { >>> 'driver': 'postgres', >>> 'username': 'postgres', >>> 'password': 'Administra8080', >>> 'host': 'localhost', >>> 'database': 'municipal', >>> 'port':'5432' >>> } >>> x=input("Digite codigo de empleado :") >>> jasper = JasperPy() >>> jasper.process(input_file,output_file=output,format_list=["pdf"], >>> parameters={'idenifica': (x)},db_connection=con) #Aquí se confecciona el >>> reporte. >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >>> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rmatarria en gmail.com Wed Nov 29 19:56:19 2017 From: rmatarria en gmail.com (Roberto Matarrita) Date: Wed, 29 Nov 2017 18:56:19 -0600 Subject: [Python-es] Como Implementar Python y JasperReport. In-Reply-To: References: Message-ID: Perfecto Mario, voy a tratar de importarla a ver como me va. De nuevo muchas gracias y estamos en contacto. Roberto El 29 de noviembre de 2017, 18:23, Mario R. Osorio escribió: > Es para mi un placer poder ayudarte. Yo llevo varios años que no programo > en Python, pero es mi lenguage favorito. La funcion popen() esta contenida > en la libreria *subprocess* > , asi que quizas solo > te falte importar esa libreria. > > Te recomiendo que pruebes las varias formas de abrir el(los) arcchivo(s) > ya que algunas podrian tener (d)efectos indeseados. *Tengo entendido* que > la forma mas *correcta* es utilizando popen(), Pero yo pienso que lo > *correcto*, a veces, esta en contraposicion a lo *desado*. > > > Dtb/Gby > ======= > Mario R. Osorio > A.S. of Computer Programming and Analysis > Web page: *http;//mario.osorio.solutions > * > Email: *mario en osorio.solutions* > *Just Choose Python!* > > ?If I had asked people what they wanted, they would have said faster > horses.? > ? Henry Ford > > > > > > > > 2017-11-29 17:45 GMT-05:00 Roberto Matarrita : > >> Don Mario, me funcionó el proceso, pude ver el reporte en la pantalla. >> Usted no sabe cuanto me ha costado hacer esto, llevo meses, buscando en >> Internet, documentación, gente que me dijera como podía hacer un reporte en >> python y realmente nadie me decía como hacerlos, a excepción de las >> herramientas que le mencioné. >> >> Gracias por ayudarme a dar el último paso que necesitaba para ver >> reportes en pantalla de una aplicación de escritorio. Ya los puedo tirar a >> PDF, Word,Excell,TXT y muchos otros formatos. Ahora es cuestión de afinarlo. >> >> 1. Una última consulta, usted como hace los reportes en python. >> 2. Que hace esta instrucción que me dio error y tuve que ponerla en >> comentario. subprocess.Popen([file],shell=True) >> >> >> Roberto. >> >> El 29 de noviembre de 2017, 10:38, Mario R. Osorio >> escribió: >> >>> Desconozco el producto JasperReport. Sin embargo, si ya tienes el >>> archivo PDF, solo te falta abrirlo, y hay varias formas de hacerlo; entre >>> ellas: >>> >>> >>> - >>> - subprocess.Popen([file],shell=True) >>> - >>> >>> import webbrowser >>> webbrowser.open_new(r'file://C:\path\to\file.pdf') >>> >>> - >>> >>> import os >>> os.startfile(filename) >>> >>> - >>> >>> os.system(filename) >>> >>> - >>> >>> >>> >>> >>> Tambien podrias hacer uso de varias librerias para manipulacion de >>> archivos PDF >>> >>> >>> Dtb/Gby >>> ======= >>> Mario R. Osorio >>> A.S. of Computer Programming and Analysis >>> Web page: *http;//mario.osorio.solutions >>> * >>> Email: *mario en osorio.solutions* >>> *Just Choose Python!* >>> >>> >>> ?If I had asked people what they wanted, they would have said faster >>> horses.? >>> ? Henry Ford >>> >>> >>> >>> >>> >>> >>> >>> 2017-11-28 22:21 GMT-05:00 Roberto Matarrita : >>> >>>> Buenas noches. Ya llevo varios meses tratando de aprender a realizar >>>> reportes en Python. He buscado reporteadores, documentación respecto al >>>> tema, pero al parecer es bastante escasa. Vi reportlab, pandas y otros, >>>> pero todos son para confeccionar a puro código. Observé un par de >>>> reporeteadores gráficos, entre ellos JasperReport, muy bueno y completo. >>>> Me enviaron el código que abajo describo, el cual logré que funcionara, >>>> se conecta a la base de datos, envía parámetros y hace el reporte. >>>> Pero tengo el gran problema que no he podido ya que desconozco como >>>> hacerlo y la persona que me envió el código, tampoco ha podido ayudarme y >>>> es como hacer para ver el reporte en pantalla. Es decir un preview. >>>> >>>> Es decir como hago para ver el reporte en la pantalla, para que el >>>> usuakrio escoja la impresora, o bien si lo va a enviar a un PDF, Word o >>>> Excel. Ya que el código lo que hace es grabar directamente el reporte al >>>> disco. >>>> Mucho agradecería la ayuda, o bien sujerencias para los reportes ya que >>>> estoy en un proyecto muy grande y este ha sido el talón de aquiles en >>>> Python, los reportes. Si alguien conoce del tema. >>>> >>>> Gracias. >>>> >>>> Describo el código. >>>> >>>> import sys >>>> import os >>>> import PyPDF2 >>>> import pyjasper >>>> from platform import python_version >>>> from pyjasper.jasperpy import JasperPy >>>> from PyPDF2 import PdfFileMerger,PdfFileReader >>>> >>>> #def advanced_example_using_database(): >>>> input_file = os.path.dirname(os.path.abspath(__file__)) + >>>> '/report4.jrxml' >>>> output = os.path.dirname(os.path.abspath(__file__)) + '/reportes' >>>> print(input_file) >>>> print(output) >>>> >>>> con = { >>>> 'driver': 'postgres', >>>> 'username': 'postgres', >>>> 'password': 'Administra8080', >>>> 'host': 'localhost', >>>> 'database': 'municipal', >>>> 'port':'5432' >>>> } >>>> x=input("Digite codigo de empleado :") >>>> jasper = JasperPy() >>>> jasper.process(input_file,output_file=output,format_list=["pdf"], >>>> parameters={'idenifica': (x)},db_connection=con) #Aquí se confecciona el >>>> reporte. >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >>> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: