2010-04-19 10 views
7

Angenommen, es gibt eine dict-Variable, die während der Laufzeit sehr groß wird - bis zu Millionen von Schlüssel: Wert-Paaren.Python große Variable RAM-Auslastung

Wird diese Variable im RAM gespeichert, wodurch der gesamte verfügbare Speicher belegt und der Rest des Systems verlangsamt wird?

Den Interpreter bitten, das gesamte Diktat anzuzeigen, ist eine schlechte Idee, aber wäre es in Ordnung, solange auf einen Schlüssel gleichzeitig zugegriffen wird?

Antwort

8

Ja, das Diktat wird im Prozessspeicher gespeichert. Wenn es also groß genug wird, dass im System-RAM nicht genug Platz ist, können Sie mit einer massiven Verlangsamung rechnen, wenn das System den Speicher auf und von der Festplatte austauscht.

Andere haben gesagt, dass ein paar Millionen Artikel kein Problem darstellen sollten; Ich bin mir nicht sicher. Das Diktat selbst (vor dem Zählen des von den Schlüsseln und Werten belegten Speichers) ist signifikant. Für Python 2.6 oder höher gibt sys.getsizeof einige nützliche Informationen darüber, wie viel RAM verschiedene Python-Strukturen belegen. Einige schnellen Ergebnisse, von Python 2.6 auf einem 64-Bit-OS X-Rechner:

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

So ist der dict Kopf variiert zwischen 36 Bytes pro Stück und 144 Bytes pro Artikel auf dieser Maschine (der genaue Wert je nachdem, wie voll die Die interne Hash-Tabelle des Dictionary ist: hier 5461 = 2 ** 14 // 3 ist einer der Schwellenwerte, bei denen die interne Hash-Tabelle vergrößert wird.Und das, bevor der Overhead für die dict-Elemente selbst hinzugefügt wird; Wenn es sich um kurze Zeichenfolgen handelt (z. B. 6 Zeichen oder weniger), fügt dies noch weitere> = 80 Byte pro Element hinzu (möglicherweise weniger, wenn viele verschiedene Tasten denselben Wert haben).

So würde es nicht , dass viele Millionen dict Elemente zu RAM auf einer typischen Maschine zu entlüften.

+0

danke, erfuhr von getsizeof von diesem. Praktisch werde ich nur mit ~ 15k Werten arbeiten, und Geschwindigkeit ist von der Bedeutung. Ich benutze ein Diktat einfach, weil ich Datenbanken überhaupt nicht berührt habe, aber ich nehme an, dass eine DB, die von einer Festplatte liest und schreibt, langsamer wäre, als ein Diktat zu lesen/schreiben? – PPTim

+0

Okay, für ein Diktat dieser Größe sollten Sie keine Probleme haben. Was sind die Arten der Schlüssel und Werte? Saiten? –

+0

meist schwebt, einige Strings, ein paar Listen – PPTim

4

Ja, ein Python dict ist im RAM gespeichert. Ein paar Millionen Schlüssel sind jedoch für moderne Computer kein Problem. Wenn Sie mehr und mehr Daten benötigen und der Arbeitsspeicher knapp wird, sollten Sie eine echte Datenbank verwenden. Zu den Optionen gehören eine relationale DB wie SQLite (übrigens in Python integriert) oder ein Schlüssel-Wert-Speicher wie Redis.

Es macht wenig Sinn, Millionen von Elementen im Interpreter anzuzeigen, aber der Zugriff auf ein einzelnes Element sollte immer noch sehr effizient sein.

+0

Was ist mit bsddb? – tstenner

1

Nach allem, was ich weiß, verwendet Python die besten Hashing-Algorithmen, so dass Sie wahrscheinlich die bestmögliche Speichereffizienz und -leistung erhalten. Nun, ob das Ganze im RAM gespeichert oder an eine Auslagerungsdatei gebunden ist, hängt von Ihrem Betriebssystem ab und hängt von der Menge an RAM ab, die Sie haben. Was ich sagen möchte, ist am besten, wenn es nur versuchen:

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

Wie sieht dies, wenn Sie es laufen? Nimmt ungefähr 350MB auf meinem System, das sollte gelinde gesagt überschaubar sein.

+0

der comp bin ich gerade mit 512 MB RAM fest, weshalb ich besorgt bin. aber die meisten Schlüssel, die ich haben werde, sind ungefähr 10k, also denke ich nicht, dass es ein Problem sein sollte. Danke für den Test, aber ich würde das hier nicht ausprobieren. – PPTim

+0

Die meisten Betriebssysteme sind ziemlich intelligent im Umgang mit Speicher und Swap. Sie sollten wirklich mit einem Wörterbuch jeder Größe in Ordnung sein, solange Sie den Festplattenspeicher für die Auslagerungsdatei haben. – ktdrv

+0

Ich vermute, dass ein zufälliger Faktor in diesem Snippet fehlt - möglicherweise der Wörterbuchschlüssel? – Kylotan

5

Das Hauptanliegen bei den Millionen von Artikeln ist nicht das Wörterbuch selbst, sondern wie viel Platz jeder dieser Artikel einnimmt. Aber wenn Sie nicht etwas Seltsames tun, sollten sie wahrscheinlich passen.

Wenn Sie ein Diktat mit Millionen von Schlüsseln haben, tun Sie wahrscheinlich etwas falsch. Sie sollten eine oder beide tun:

  1. Abbildung heraus, was Sie Datenstruktur sollte eigentlich verwenden, weil ein einzelner dict wahrscheinlich nicht die richtige Antwort ist. Was genau das ist, hängt davon ab, was du tust.

  2. Verwenden Sie eine Datenbank. Ihr Python sollte mit einem sqlite3-Modul kommen, also ist das ein Anfang.