Große Tabelle (in Jupyter modifiziert & in Variable gespeichert) ohne MemoryError extrahieren

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
monkiiiii
User
Beiträge: 13
Registriert: Mittwoch 13. Oktober 2021, 15:44

Hallo Leute,

ich habe eine große Tabelle. Diese hab ich in Jupyter modifiziert und in einer Variable gespeichert. Jetzt möchte ich die modifizierte Version der Tabelle wieder in einer neuen .txt Datei speichern, da die Funktion, für die ich die Datei benötige im call einen path verlangt.
Zunächst dauert das extrem lange und zeigt mir dann irgendwann einen MemoryError an.

from tabulate import tabulate
with open('sub28.txt', 'w') as f:
f.write(tabulate(df))
#too large I guess --> MemoryError

Zuvor lasse ich zum Verhindern des MemoryErrors bereits das laufen:

import gc
gc.collect()

was mir zuvor schon mal bei dem Problem geholfen hat.

Habt ihr eine Idee?


Vielen Dank im Voraus und liebste Grüße,
monkiiiii
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Probier mal:

Code: Alles auswählen

with open('sub28.txt', 'w') as file:
    df_as string = df.to_string(header=False, index=False)
    file.write(df_as_string)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
monkiiiii
User
Beiträge: 13
Registriert: Mittwoch 13. Oktober 2021, 15:44

Das gibt mir nach langem Laden wieder einen MemoryError
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@monkiiiii,

ich vermute, dass "tabulate" durch Hinzufügen zusätzlicher Zeichen den Speicher aufbläht. Das könnte auch bei df.to_string() passieren...?
Vielleicht hilf es, das DataFrame zeilenweise in die Datei zu schreiben. Das dürfte auch sehr lange dauern, sollte aber den Speicher nicht überlasten.
monkiiiii
User
Beiträge: 13
Registriert: Mittwoch 13. Oktober 2021, 15:44

Alles klar, wie schreibe ich das denn zeilenweise ein?
Danke auf jeden Fall schon mal.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@monkiiiii,

das hängt im Detail wohl von deinen Daten ab.
Ein simples Beispiel würde so gehen:

Code: Alles auswählen

import pandas as pd

df = pd.DataFrame(
    {
        "Num": [4234, 234, 334, 424, 5243],
        "Name": ["Anton", "Berta", "Charly", "Donald", "Emil"],
        "Ratio": [0.002, 0.42, 0.333, 0.212, 0.555],
    }
)

with open("data.txt", "w", encoding="utf-8") as output_file:
    for index, data in df.iterrows():
        num, name, ratio = tuple(data.to_list())
        output_file.write(f"{num:>5d} |{name:>10} |{ratio:>10.3f}\n")

narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@monkiiiii: Benutzt du ein 32-Bit-Python? Dann ist der Prozess auf 4 GB limitiert, egal wie viel RAM der Computer tatsächlich hat. Falls du also genug RAM hast, könnte auch ein 64-Bit-Python helfen, ohne dass du das Programm an sich ändern musst.

Und welches Format brauchst du? Bzw. hast du da Kontrolle drüber? `pd.DataFrame.to_csv` zum Beispiel sollte die Daten nicht mehrfach im Speicher halten müssen.
Antworten