9 Stimmen

Python große variable RAM-Nutzung

Angenommen, es gibt eine Diktatvariable, die während der Laufzeit sehr groß wird - bis zu Millionen von Schlüssel:Wert-Paaren.

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

Den Interpreter aufzufordern, das gesamte Diktat anzuzeigen, ist eine schlechte Idee, aber wäre es in Ordnung, solange jeweils nur eine Taste angesprochen wird?

10voto

Mark Dickinson Punkte 26875

Ja, das Diktat wird im Prozessspeicher gespeichert. Wenn es also so groß wird, dass der Platz im System-RAM nicht mehr ausreicht, können Sie mit einer massiven Verlangsamung rechnen, da das System beginnt, Speicher von und auf die Festplatte auszulagern.

Andere haben gesagt, dass ein paar Millionen Artikel kein Problem darstellen sollten; ich bin mir da nicht so sicher. Der Overhead für das Diktat selbst (ohne den Speicherbedarf für die Schlüssel und Werte zu berücksichtigen) ist erheblich. Für Python 2.6 oder später, sys.getsizeof gibt einige nützliche Informationen darüber, wie viel RAM verschiedene Python-Strukturen benötigen. Einige schnelle 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

Der Diktat-Overhead schwankt also auf diesem Rechner zwischen 36 Byte pro Eintrag und 144 Byte pro Eintrag (der genaue Wert hängt davon ab, wie voll die interne Hash-Tabelle des Wörterbuchs ist; hier ist 5461 = 2**14//3 einer der Schwellenwerte, ab dem die interne Hash-Tabelle vergrößert wird). Und das ist, bevor man den Overhead für die Diktat-Elemente selbst hinzurechnet; wenn es sich um kurze Zeichenketten handelt (z.B. 6 Zeichen oder weniger), dann sind das immer noch >= 80 Bytes pro Element (möglicherweise weniger, wenn viele verschiedene Schlüssel denselben Wert haben).

Es wäre also nicht nötig dass viele Millionen Diktate, die den Arbeitsspeicher eines typischen Rechners auslasten.

5voto

kwatford Punkte 21718

Das Hauptproblem bei den Millionen von Einträgen ist nicht so sehr das Wörterbuch selbst, sondern wie viel Platz jeder einzelne Eintrag einnimmt. Wenn Sie nicht gerade etwas Seltsames tun, sollten sie aber trotzdem passen.

Wenn Sie allerdings ein Diktiergerät mit Millionen von Tasten haben, machen Sie wahrscheinlich etwas falsch. Sie sollten eines oder beides tun:

  1. Finden Sie heraus, welche Datenstruktur Sie tatsächlich verwenden sollten, denn ein einzelnes Dict ist wahrscheinlich nicht die richtige Antwort. Was das genau sein soll, hängt davon ab, was Sie tun.

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

4voto

Eli Bendersky Punkte 246100

Ja, eine Python dict wird im RAM gespeichert. Ein paar Millionen Schlüssel sind für moderne Computer jedoch 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üsselwertspeicher wie Redis.

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

2voto

ktdrv Punkte 3482

Soweit ich weiß, verwendet Python die besten Hashing-Algorithmen, so dass Sie wahrscheinlich die bestmögliche Speichereffizienz und Leistung erhalten werden. Ob das Ganze im Arbeitsspeicher gehalten oder in eine Auslagerungsdatei ausgelagert wird, hängt vom Betriebssystem und der Größe des Arbeitsspeichers ab, über den Sie verfügen. Am besten ist es, wenn Sie es einfach ausprobieren:

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

Wie sieht das aus, wenn Sie es ausführen? Benötigt etwa 350Mb auf meinem System, was gelinde gesagt überschaubar sein sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X