Wie ist der Arbeitsspeicher, der zum Speichern von Daten im Speicher benötigt wird, mit dem Speicherplatz vergleichbar, der zum Speichern der gleichen Daten in einer Datei erforderlich ist? Oder gibt es keine verallgemeinerte Korrelation?
Beispiel: Ich habe einfach eine Milliarde Fließkommawerte. In Binärform gespeichert, wären das 4 Milliarden Bytes oder 3,7 GB auf der Festplatte (ohne Header und ähnliches). Dann sage ich, dass ich diese Werte in eine Liste in Python lese ... wie viel RAM sollte ich erwarten?
Wenn die Daten in einem Python-Objekt gespeichert werden, werden den tatsächlichen Daten im Speicher etwas mehr Daten hinzugefügt.
Dies kann leicht getestet werden.
Es ist interessant festzustellen, dass der Overhead des Python-Objekts zunächst für kleine Daten wichtig ist, aber schnell vernachlässigt wird.
Hier ist der iPython-Code, der zum Erzeugen des Plots verwendet wurde
%Vor%In einer einfachen Python-Liste benötigt jede doppelt genaue Zahl mindestens 32 Bytes Speicher, aber nur 8 Bytes werden verwendet, um die tatsächliche Zahl zu speichern, der Rest ist notwendig, um die dynamische Natur von Python zu unterstützen.
Das in CPython verwendete float-Objekt ist in floatobject.h definiert:
%Vor% Dabei ist PyObject_HEAD
ein Makro, das auf die PyObject
struct erweitert :
Daher speichert jedes Gleitkommaobjekt in Python zwei zeigergroße Felder (also jeweils 8 Byte in einer 64-Bit-Architektur) neben dem 8-Byte-Double, was 24 Byte Heapspeicher pro Nummer ergibt. Dies wird von sys.getsizeof(1.0) == 24
bestätigt.
Das bedeutet, dass eine Liste von n
in Python verdoppelt mindestens 8*n
bytes Speicher belegt, nur um die Zeiger ( PyObject*
) auf die Anzahl Objekte und jedes Zahlenobjekt zu speichern benötigt zusätzliche 24 Bytes. Um es zu testen, versuchen Sie die folgenden Zeilen in der Python REPL:
und sehen Sie die Speicherauslastung des Python-Interpreters (ich habe rund 350 MB Speicherplatz auf meinem x86-64-Computer bekommen). Beachten Sie, dass wenn Sie versuchten:
%Vor% Sie würden nur etwa 80 MB erhalten, weil alle Elemente in der Liste auf die selbe Instanz der Gleitkommazahl 1.0
verweisen.