Killed pd.read_csv

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
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Hallo Leute ich habe folgendes Problem,

Ich möchte Dateien mit pd.read_csv einlesen und daraus Werte auslesen und berechnen. Bisher klappte auch alles. Jedoch habe ich nun neue Dateien bekommen mit dem gleichen Aufbau. Der Unterschied ist der, dass die neuen Dateien größer sind.

Bisher waren die Daten insgesamt etwa 2 GB groß und es hat schon ein bis zwei Minuten gedauert bis das Skript durchgelaufen ist.

Nun sind es ca. 3,5 GB und der einzige Fehler der kommt ist Killed.

Hat jemand eine Idee wie ich das Problem beheben könnte?

Mein code sieht wie folgt aus:
Cyl_No = 1
SP_raw = pd.read_csv('qs-post-spark-plugs-cyl_0' + str(Cyl_No) + '.arc', header=2, delim_whitespace=True, low_memory=False)
Cyl_raw = pd.read_csv('qs-post-cylinder-cyl_0' + str(Cyl_No) + '.arc', header=2, delim_whitespace=True, low_memory=False)
...

Mit freundlichen Grüßen

MRO
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Wie lautet die vollständige Fehlermeldung (inklusive Fehlercode bzw. Exitcode)

Wahrscheinlich geht dir aber schlicht der Arbeitsspeicher aus, bzw. der Speicher, der von einem Prozess angefordert werden darf.
Man kann Generatoren verwenden um auf Pandas-Datenframes zu arbeiten. Tust du das?
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

Killed heißt, dass das Programm zu viel Speicher verbraucht.
Wie viel Arbeitsspeicher hast Du?
Tritt der Fehler schon beim Lesen auf, oder bei der weiteren Verarbeitung? Wie lautet dann der gesamte Code?

Strings stückelt man nicht mit + zusammen, sondern benutzt Stringformatierung.
Variablennamen schreibt man immer klein_mit_unterstrich. Benutze keine Abkürzungen!

Code: Alles auswählen

cycle_number = 1
spark_plugs_raw = pd.read_csv(f'qs-post-spark-plugs-cyl_{cycle_number:02d}.arc', header=2, delim_whitespace=True, low_memory=False)
cylinder_raw = pd.read_csv(f'qs-post-cylinder-cyl_{cycle_number:02d}.arc', header=2, delim_whitespace=True, low_memory=False)
Benutzeravatar
__blackjack__
User
Beiträge: 13119
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Falls der Arbeitsspeicher eigentlich reichen müsste, wäre die nächste Frage ob das ein 32-Bit-Python ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Also ich habe mal nachgeschaut:

Die Fehlermeldung lautet nur Killed, ohne einen Error oder Ähnliches.

Von Generatoren habe ich noch nichts gehört. Nach was könnte ich da googeln.

Ich habe 4 GB Arbeitsspeicher.

Ich rufe insgesamt 5 Dateien mit pd.read_csv auf. Nach dem Aufrufen der 4. Datei erscheint Killed. Das habe ich gerade getestet.

Mein Python ist ein 64-Bit-Python.
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wie viele Daten sind denn die 5 Dateien insgesamt? Bei einigen GB pro Datei wird das schon ziemlich knapp. Und was willst Du mit den Daten machen? Brauchst Du sie alle komplett im Arbeitsspeicher? Ein bißchen mehr Information wäre schon gut, wenn Du hier Hilfe willst.
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Nein ich brauche sie theoretisch nicht komplett sondern nur einzelne Spalten. Kann man diese über den Spaltennamen bei pd.read_csv selektieren, so wie es bei pd.Dataframes möglich ist?

Ich kenne mich nicht so gut aus und habe mir bisher alles selbst über ein paar Tutorials beigebracht. Da das komplette Einladen der csv_Dateien bisher immer geklappt hat habe ich mir darüber nie Gedanken gemacht.
Benutzeravatar
__blackjack__
User
Beiträge: 13119
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MRO5494: Man muss auch unterscheiden zwischen Dateigrösse und was das am Ende im RAM benötigt und man muss bis zu doppelt so viel RAM für Dataframes/Arrays einplanen weil nicht wenige Operationen Platz für ein Zwischenergebnis brauchen.

Und wenn der Speicher knapp ist/wird, dann ist die gewählte `low_memory`-Einstellung falsch. Und wenn Du nicht alle Spalten brauchst, dann kannst Du danach schon beim einlesen filtern (`usecols`).
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MRO5494
User
Beiträge: 27
Registriert: Dienstag 26. November 2019, 16:20

Alles Klar! Dann lese ich sie spaltenweise ein. Vielen Dank für eure Hilfe!
Antworten