Pergunta

Estou criando um servidor em rede para um clone boggle que escrevi no Python, que aceita usuários, resolve as placas e obtém a entrada do jogador. O arquivo de dicionário que estou usando é de 1,8 MB (o dicionário Enable2K) e preciso que ele esteja disponível para várias classes de solucionador de jogos. No momento, eu o tenho para que cada classe iterasse através da linha por linha e gera uma tabela de hash (matriz associativa), mas quanto mais classes de solucionador instanciar, mais memória ela ocupa.

O que eu gostaria de fazer é importar o arquivo de dicionário uma vez e passá -lo para cada instância do solucionador conforme eles precisam. Mas qual é a melhor maneira de fazer isso? Devo importar o dicionário no espaço global e acessar -o na classe solucionadora como globals () ['dicionário']? Ou devo importar o dicionário e depois passá -lo como um argumento para o construtor de classe? Um deles é melhor que o outro? Existe uma terceira opção?

Foi útil?

Solução

Se você criar um módulo Dictionary.py, contendo código que lê o arquivo e cria um dicionário, esse código será executado apenas na primeira vez em que for importado. Outras importações retornarão uma referência à instância do módulo existente. Como tal, suas aulas podem:

import dictionary

dictionary.words[whatever]

onde dictionary.py tem:

words = {}

# read file and add to 'words'

Outras dicas

Embora seja essencialmente um singleton neste momento, os argumentos usuais contra os globais se aplicam. Para um substituto pitônico de singleton, procure o objeto "Borg".

Essa é realmente a única diferença. Depois que o objeto do dicionário é criado, você está apenas vinculando novas referências à medida que ele o passa, a menos que seja executado explicitamente uma cópia profunda. Faz sentido que seja construído centralmente uma vez e apenas uma vez, desde que cada instância do solucionador não exija uma cópia privada para modificação.

Adam, lembre -se disso em Python quando você diz:

a = read_dict_from_file()
b = a

... você não é realmente cópia a, e, assim, usando mais memória, você está apenas fazendo b outra referência ao mesmo objeto.

Então, basicamente algum Das soluções que você propõe será muito melhor em termos de uso da memória. Basicamente, leia no dicionário uma vez e depois aguarde uma referência a isso. Se você faz isso com uma variável global ou passá -la para cada instância ou outra coisa, fará referência ao mesmo objeto e não a duplicar.

Qual é o mais pitônico? Essa é uma lata de vermes, mas aqui está o que eu faria pessoalmente:

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.

Dependendo do que seu ditado contém, você pode estar interessado nos módulos 'Shelve' ou 'Anydbm'. Eles oferecem interfaces semelhantes a dicados (apenas cordas como chaves e itens para 'anydbm', e strings como chaves e qualquer objeto Python como item para 'shelve'), mas os dados estão na verdade em um arquivo dbm (gdbm, ndbm, dbhash, BSDDB, dependendo do que está disponível na plataforma.) Você provavelmente ainda deseja compartilhar o banco de dados real entre as classes, como está pedindo, mas isso evitaria a etapa de análise do text-text, bem como a manutenção -Memory Bit.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top