Pergunta

Eu tenho alguns dados armazenados em um DB que eu quero para o processo.DB acesso é dolorosamente lento, então eu decidi carregar todos os dados em um dicionário antes de qualquer processamento.No entanto, devido ao enorme tamanho dos dados armazenados, eu recebo um erro de memória (eu vejo mais de 2 shows a ser utilizado).Então eu decidi usar um disco de estrutura de dados, e descobri que usando prateleira é uma opção.Aqui está o que eu faço (pseudo código python)

def loadData():
    if (#dict exists on disk):
        d = shelve.open(name)
        return d
    else:
        d = shelve.open(name, writeback=True)
        #access DB and write data to dict
        # d[key] = value 
        # or for mutable values
        # oldValue = d[key]
        # newValue = f(oldValue)
        # d[key] = newValue 
        d.close()
        d = shelve.open(name, writeback=True)
        return d

Eu tenho um par de perguntas,

1) eu realmente preciso de write-back=True?O que ele faz?

2) eu ainda recebo uma exceção de OutofMemory, desde que eu não exerce qualquer controlo sobre quando os dados estão sendo gravados para o disco.Como faço isso?Eu tentei fazer um sync() a cada poucas iterações, mas que não ajuda tanto.

Obrigado!

Foi útil?

Solução

writeback=True forças de prateleira para manter na memória de qualquer item já obtidos, e escrevê-los de volta quando a prateleira é fechado.Então, ele consome muito mais memória, e retarda o fechamento.

A vantagem do parâmetro é que, com ele, você não precisa a torcido do código de você mostrar no seu comentário para mutável itens cujo modificador é um método -- apenas

shelf['foobar'].append(23)

funciona (se shelf foi aberta com a escrita habilitado), assumindo que o item chave 'foobar' é uma lista de curso, ainda que silenciosamente ser um não-operação (deixando o item em disco inalterado) se shelf foi aberto sem escrita -- neste último caso, você realmente não precisa de código

thelist = shelf['foobar']
thelist.append(23)
shekf['foobar'] = thelist

em seu comentário do espírito-que é estilisticamente um pouco de chatice.

No entanto, desde que você são ter problemas de memória, eu definitivamente recomendo não usando este duvidosa escrita opção.Eu acho que posso chamá-lo de "duvidoso", pois eu era o único a propor e a primeira aplicação, mas isso foi há muitos anos, e eu principalmente se arrependeu de fazer isso -- generales mais confusão (como o seu Q evidências) que permite a elegância e algo prático em mover o código escrito originalmente para trabalhar com dicts (que seria usar a primeira expressão idiomática, não o segundo, e, portanto, necessidade de reconfiguração para ser utilizável com prateleiras sem traço).Ah bem, desculpem, é fiz parece uma boa idéia no momento.

Outras dicas

Usando o sqlite3 O módulo é provavelmente a sua melhor escolha aqui. De qualquer forma, você pode usar o SQLite inteiramente na memória, pois sua pegada de memória pode ser um pouco menor do que usar objetos Python de qualquer maneira. Geralmente é uma escolha melhor do que usar shelve de qualquer forma; shelve usos pickle por baixo, que raramente é o que você quer.

Inferno, você pode apenas converter todo o seu banco de dados existente em um banco de dados SQLite. Sqlite é bom e rápido.

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