Pregunta

Estoy creando un servidor en red para un clon que escribí en python, que acepta usuarios, resuelve los tableros y puntúa las entradas del jugador. El archivo del diccionario que estoy usando es de 1.8MB (el diccionario ENABLE2K), y necesito que esté disponible para varias clases de solucionadores de juegos. En este momento, lo tengo para que cada clase itere a través del archivo línea por línea y genere una tabla hash (matriz asociativa), pero cuantas más clases de solucionador cree, más memoria ocupará.

Lo que me gustaría hacer es importar el archivo del diccionario una vez y pasarlo a cada instancia de Solver cuando lo necesiten. ¿Pero cuál es la mejor manera de hacer esto? ¿Debo importar el diccionario en el espacio global y luego acceder a él en la clase de solucionador como globales () ['diccionario']? ¿O debería importar el diccionario y luego pasarlo como un argumento al constructor de la clase? ¿Es uno de estos mejor que el otro? ¿Hay una tercera opción?

¿Fue útil?

Solución

Si crea un módulo dictionary.py, que contiene un código que lee el archivo y crea un diccionario, este código solo se ejecutará la primera vez que se importe. Las importaciones posteriores devolverán una referencia a la instancia del módulo existente. Como tal, sus clases pueden:

import dictionary

dictionary.words[whatever]

donde dictionary.py tiene:

words = {}

# read file and add to 'words'

Otros consejos

A pesar de que es esencialmente un singleton en este punto, se aplican los argumentos habituales en contra de los globales. Para un sustituto de singleton pythonic, busque el " borg " objeto.

Esa es realmente la única diferencia. Una vez que se crea el objeto de diccionario, solo está vinculando nuevas referencias a medida que las pasa, a menos que realice explícitamente una copia profunda. Tiene sentido que se construya de forma centralizada una sola vez, siempre que cada instancia de solucionador no requiera una copia privada para su modificación.

Adam, recuerda eso en Python cuando dices:

a = read_dict_from_file()
b = a

... en realidad no está copiando a , y por lo tanto, utilizando más memoria, simplemente está haciendo b otra referencia al mismo objeto.

Entonces, básicamente, cualquiera de las soluciones que proponga será mucho mejor en términos de uso de memoria. Básicamente, lea el diccionario una vez y luego continúe con una referencia a eso. Ya sea que lo haga con una variable global, o que pase a cada instancia, o algo más, estará haciendo referencia al mismo objeto y no lo duplicará.

¿Cuál es la más pitónica? Eso es todo un 'gran número de gusanos, pero esto es lo que yo haría personalmente:

def main(args):
  run_initialization_stuff()
  dictionary = read_dictionary_from_file()
  solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ]

HTH.

Dependiendo de lo que contenga su dictado, puede interesarle los módulos 'shelve' o 'anydbm'. Le dan interfaces similares a dict (solo cadenas como claves y elementos para 'anydbm', y cadenas como claves y cualquier objeto de Python como elemento para 'archivar') pero los datos están realmente en un archivo DBM (gdbm, ndbm, dbhash, bsddb, dependiendo de lo que esté disponible en la plataforma.) Es probable que aún desee compartir la base de datos real entre las clases que solicita, pero evitaría el paso del archivo de análisis de texto así como el mantenimiento de todo. -memory bit.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top