Domanda

dicono che c'è una variabile dict che cresce molto grande in fase di esecuzione - up in milioni di coppie chiave: valore.

Questo variabili vengono memorizzati in RAM, in modo efficace utilizzando tutta la memoria disponibile e rallentando il resto del sistema?

Chiedere l'interprete per visualizzare l'intera dict è una cattiva idea, ma sarebbe bene finché un tasto si accede alla volta?

È stato utile?

Soluzione

Si, il dict verrà memorizzato nella memoria del processo. Quindi, se si arriva abbastanza grande che non c'è abbastanza spazio nella RAM di sistema, allora si può aspettare di vedere massiccia rallentamento in quanto il sistema si avvia lo swapping della memoria da e su disco.

Altri hanno detto che qualche milione di articoli non dovrebbero rappresentare un problema; Non sono così sicuro. L'overhead dict stessa (prima del conteggio della memoria occupata dai chiavi e valori) è significativa. Per Python 2.6 o versione successiva, sys.getsizeof dà alcune informazioni utili su quanto RAM varie strutture Python occupano. Alcuni risultati rapidi, da Python 2.6 su una macchina OS X a 64 bit:

>>> 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

Così il dict varia tra testa 36 byte per voce e 144 byte per voce su questa macchina (il valore esatto dipende da come piena tabella hash interna del dizionario è; qui 5461 = 2 ** 14 // 3 è uno dei soglie dove viene ingrandita tabella hash interna). E questo è prima di aggiungere l'overhead per le voci dict stessi; se sono tutte le stringhe brevi (6 caratteri o meno, diciamo) allora che aggiunge ancora un altro> = 80 byte per voce (forse meno se molti tasti differenti condividono lo stesso valore).

Quindi non ci sarebbe voluto che molti milioni di articoli dict a RAM di scarico su una macchina tipica.

Altri suggerimenti

La preoccupazione principale con i milioni di voci non è il dizionario in se, quanto la quantità di spazio ciascuno di questi elementi riprende. Eppure, a meno che non si sta facendo qualcosa di strano, dovrebbero probabilmente in forma.

Se hai un dict con milioni di tasti, anche se, probabilmente stai facendo qualcosa di sbagliato. Si dovrebbe fare uno o entrambi:

  1. La figura che cosa struttura di dati si dovrebbe effettivamente essere usando, perché un solo __dict__ probabilmente non è la risposta giusta. Esattamente quello che questo sarebbe dipende da quello che stai facendo.

  2. Usa un database. Il tuo Python dovrebbe venire con un modulo sqlite3, quindi questo è un inizio.

Sì, un dict Python viene memorizzato nella RAM. Qualche milione di chiavi non è un problema per i computer moderni, tuttavia. Se avete bisogno di più e più dati e RAM si sta esaurendo, considerare l'utilizzo di una vera e propria banca dati. Le opzioni includono un DB relazionale come SQLite (built-in in Python, tra l'altro) o di un negozio di valori-chiave come Redis.

Non ha molto senso la visualizzazione di milioni di articoli nell'interprete, ma l'accesso a un singolo elemento dovrebbe essere ancora molto efficace.

Per quanto ne so Python utilizza i migliori algoritmi di hashing e pertanto si è probabilmente andando a ottenere la migliore efficienza della memoria e le prestazioni possibili. Ora, se il tutto è tenuto in RAM o impegnata in un file di swap è fino al vostro sistema operativo e dipende dalla quantità di RAM presente. Quello che vorrei dire è meglio se per solo provare:

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

Come è alla ricerca quando lo si esegue? Vogliono circa 350Mb sul mio sistema, che dovrebbe essere gestibile per non dire altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top