Pergunta

Digamos que exista uma variável dict que cresce muito grande durante o tempo de execução - até milhões de pares de chave: valores.

Essa variável é armazenada na RAM, usando efetivamente toda a memória disponível e desacelerando o restante do sistema?

Pedir ao intérprete que exiba todo o ditado é uma má idéia, mas tudo bem, desde que uma chave seja acessada de cada vez?

Foi útil?

Solução

Sim, o ditado será armazenado na memória do processo. Portanto, se for grande o suficiente para que não haja espaço suficiente na RAM do sistema, você poderá esperar uma desaceleração maciça à medida que o sistema começa a trocar a memória de e para o disco.

Outros disseram que alguns milhões de itens não devem representar um problema; Eu não tenho tanta certeza. A sobrecarga do dicto (antes de contar a memória adotada pelas chaves e valores) é significativa. Para Python 2.6 ou mais tarde, sys.getSizeof Fornece algumas informações úteis sobre a quantidade de RAM, várias estruturas de Python ocupam. Alguns resultados rápidos, do Python 2.6 em uma máquina OS X de 64 bits:

>>> from sys import getsizeof
>>> getsizeof(dict((n, 0) for n in range(5462)))/5462.
144.03368729403149
>>> getsizeof(dict((n, 0) for n in range(5461)))/5461.
36.053470060428495

Portanto, a sobrecarga do dicto varia entre 36 bytes por item e 144 bytes por item nesta máquina (o valor exato, dependendo de quão cheia a tabela de hash do dicionário é; aqui 5461 = 2 ** 14 // 3 é um dos limites em que o A tabela de hash interna é ampliada). E isso é antes de adicionar a sobrecarga para os próprios itens de dicto; Se forem todas as cordas curtas (6 caracteres ou menos, digamos), isso ainda adiciona outros> = 80 bytes por item (possivelmente menos se muitas chaves diferentes compartilharem o mesmo valor).

Então não levaria este Muitos milhões de itens ditam para exaustar a RAM em uma máquina típica.

Outras dicas

A principal preocupação com os milhões de itens não é o próprio dicionário, mas quanto espaço cada um desses itens ocupa. Ainda assim, a menos que você esteja fazendo algo estranho, eles provavelmente deveriam se encaixar.

Se você tem um ditado com milhões de chaves, provavelmente está fazendo algo errado. Você deve fazer um ou ambos:

  1. Descubra qual estrutura de dados você realmente deve estar usando, porque um único ditado provavelmente não é a resposta certa. Exatamente o que isso seria depende do que você está fazendo.

  2. Use um banco de dados. Seu Python deve vir com um módulo SQLITE3, então é um começo.

Sim, um python dict é armazenado em RAM. Alguns milhões de chaves não são um problema para os computadores modernos, no entanto. Se você precisar de mais e mais dados e RAM está acabando, considere usar um banco de dados real. As opções incluem um banco de dados relacional como o SQLite (embutido em Python, a propósito) ou uma loja de valores-chave como Redis.

Faz pouco sentido exibir milhões de itens no intérprete, mas o acesso a um único elemento ainda deve ser muito eficiente.

Para tudo o que sei que o Python usa os melhores algoritmos de hash, para que você provavelmente obterá a melhor eficiência e desempenho de memória possíveis. Agora, se a coisa toda é mantida em RAM ou comprometida com um arquivo de troca, depende do seu sistema operacional e depende da quantidade de RAM que você possui. O que eu diria é melhor se apenas tentar:

from random import randint
a = {}
for i in xrange(10*10**6):
    a[i] = i

Como isso está olhando quando você o executa? Leva cerca de 350 MB no meu sistema, o que deve ser gerenciável para dizer o mínimo.

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