Seite 1 von 1

Warum tritt ein MemoryError auf?

Verfasst: Freitag 9. März 2018, 14:01
von Judge
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.

Re: Warum tritt ein MemoryError auf?

Verfasst: Freitag 9. März 2018, 14:28
von Sirius3
@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.

Re: Warum tritt ein MemoryError auf?

Verfasst: Freitag 9. März 2018, 14:40
von narpfel
@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.

Re: Warum tritt ein MemoryError auf?

Verfasst: Sonntag 11. März 2018, 14:07
von Judge
Danke für die Antworten - das war mein Fehler ... vielen Dank! :)