Warum tritt ein MemoryError auf?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hallo zusammen,

ich spiele aus einer Laune heraus gerade mit folgendem. Vorab: Ja, ich bin mir bewusst das man eine (potentiell) große Datei nicht wie hier gezeigt öffnen sollte, dennoch interessiert mich was da passiert aus akademischem Wissensdurst heraus:

Ich habe rund 10 GB RAM frei:

Code: Alles auswählen

$ free -m
              gesamt       benutzt     frei      gemns.  Puffer/Cache verfügbar
Speicher:       15683        4033        8458         668        3192       10714
Auslagerungsspeicher:           0           0           0
Ich habe unter /home/mrichter/Downloads/Aufheben/openSUSE-Leap-42.3-DVD-x86_64.iso eine rund 4,4 GB große ISO Datei liegen:

Code: Alles auswählen

$ readlink -f openSUSE-Leap-42.3-DVD-x86_64.iso
/home/mrichter/Downloads/Aufheben/openSUSE-Leap-42.3-DVD-x86_64.iso
$ ls -lh openSUSE-Leap-42.3-DVD-x86_64.iso
-rw-r--r-- 1 mrichter mrichter 4,4G Jan 30 17:45 openSUSE-Leap-42.3-DVD-x86_64.iso
Annahme: Die müsste locker in meinen RAM passen.

Also mache ich folgendes unter Python 3.6.3:

Code: Alles auswählen

import os
os.chdir('/home/mrichter/Downloads/Aufheben')
with open('openSUSE-Leap-42.3-DVD-x86_64.iso') as isofile:
     isocontent = isofile.read()
 
Traceback (most recent call last):
  File "/home/mrichter/.virtualenvs/pycharm3.6.3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2869, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-88075b2fd8ed>", line 2, in <module>
    isocontent = isofile.read()
  File "/home/mrichter/.virtualenvs/pycharm3.6.3/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
MemoryError
Meine Frage: Wieso passiert das? Gibt es da eine "magische Grenze" in Python für die Variablenzuweisung o.ä.? Zum Zeitpunkt des MemoryErrors war noch rund 6 GB RAM frei.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Judge: Du öffnest die Datei als Text-Datei, da wird also erst Speicher für die Bytes gebraucht und zusätzlich das 4-fache an Speicher für Text.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Judge: Der Hintergrund, warum `str`s 4 Byte pro Zeichen benötigen, ist dass sie UTF-32-kodiert gespeichert werden. Das wird gemacht, weil in UTF-32 jedes Zeichen gleich lang (eben 4 Byte) ist, wohingegen in anderen Encodings, die alle Unicode-Zeichen encodieren können, Zeichen unterschiedlich lang sein können. Und dann kann man nicht mehr mit einem Index auf einzelne Zeichen zugreifen, ohne den ganzen String zu durchlaufen.
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Danke für die Antworten - das war mein Fehler ... vielen Dank! :)
Antworten