MemoryError: Suche eine gute Datenstruktur

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
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Hallo BlackJack, hallo sma,

danke für die weiteren Beiträge, die kommen meinem Verständnis zugute. Bei der Gelegenheit habe ich noch 'ne vermeintlich kurze Frage zur Speicherauslastung:
Wie kann ich die aktuelle Speicherauslastung von Python aus sehen? Ich würde zur Kontrolle gerne nach dem Einlesen von langen Datenzeilen die aktuelle Speicherauslastung über die Konsole ausgeben.

Grüße, Tyrax
BlackJack

Die Speicherbelegung aus Betriebssystem-Sicht kann man mit dem psutil-Modul ermitteln. Sowohl gesamt, als auch für einzelne Prozesse (und damit auch für den, in dem man das macht).
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Nach wie vor bin ich der Meinung, ich bekomme (problemlos) ein Array mit 32 Mio Einträge in den Hauptspeicher. Ich habe allerdings nicht probiert, was ein `map(int, arr)` anrichtet. Ich hätte vermutet, CPython ist schau genug, ein zweites Array mit 32 Mio Datensätzen anzulegen und nicht zu versuchen, dieses inkrementell zu vergrößern, was bei dem üblichen Algorithmus, die Größe immer zu verdoppelt, zu 64 Mio Einträgen a 8 Bytes führen könnte.

Ich kann's gerade nicht ausprobieren, da mein System schon jetzt im Swap ist und ich nicht 2 GB oder so über habe. Aber ich sagte ja, es wäre nicht weiter schwer, die Zeile nicht komplett sondern nur bis jeweils zum ";" bzw. Zeilende zu lesen:

Code: Alles auswählen

    with open(name) as f:
        c = f.read(1)
        b = ""
        i = 0
        while True:
            if c == '' or c == '\n' or c == ';':
                nums[i] += int(b)
                b = ""
                if c == '\n':
                    i = 0
                else:
                    i += 1
            else:
                b += c
            if not c:
                break
            c = f.read(1)
Stefan
BlackJack

@sma: Theoretisch müsste der Speicher ausreichen und theoretisch könnte man für jedes Byte einer >100 MiB grossen Datei auch einen `read()`-Aufruf absetzen. Praktisch ist beides nicht ernsthaft brauchbar.
Antworten