Nur letzten Teil einer TXT auslesen

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
Ragyal
User
Beiträge: 3
Registriert: Montag 29. Dezember 2014, 17:59

Hallo,

ich hab ein Problem beim Auslesen einer sehr groß werdenden Textdatei, da das Programm auf einem Raspberry Pi läuft.
Ich speichere in der Datei Zahlen ab und wenn das Programm gestartet wird, werden die Zahlen aus der Datei ausgelesen, aber letztendlich brauche ich beim Starten nur die letzte Zahl aus der Datei.
Nun würde ich gerne, anstatt die ganze Datei in Python zu lesen, nur den letzten Teil bzw. die letzte Zahl auslesen, um den Aufwand gering zu halten.
Hat da jemand einen Tipp für mich?

Die Datei sieht momentan so aus:

Code: Alles auswählen

2,3,5,7,11,...,259397,259411,259421,259429,259451,259453,259459,259499,259507
bzw. so nach einem Versuch mit x.readlines():

Code: Alles auswählen

2\n3\n5\n7\n11\n...259397\n259411\n259421\n259429\n259451\n259453\n259459\n259499\n259507\n
Ein Dankeschön schon einmal im Voraus. Vielleicht gibt es eine nicht so rechen aufwändige Lösung.
BlackJack

@Ragyal: Das ist ja interessant das bei Dir beim lesen der Datei aus Kommas Zeilenendezeichen werden. Den Trick habe ich bis jetzt auch nicht gesehen. :twisted:

Grundsätzlich sind Textdateien nicht für so einen Zugriff gemacht. Du kannst natürlich mit `seek()` den Dateizeiger soweit vom Ende der Datei platzieren, dass Du Dir sicher bist das mindestens die letzte Zeile dahinter ist, dann alles einlesen, am Trennzeichen aufteilen und das letzte Element nehmen.
Ragyal
User
Beiträge: 3
Registriert: Montag 29. Dezember 2014, 17:59

Hab ich schlecht beschrieben, aber die zweite Variante hat nichts mit der ersten zu tun, sondern war nur zum Testen mit readlines gedacht, aber dadurch wurde der Rechenaufwand nicht geringer.
Ich guck mal was ich mit seek() hinkriege.
Ragyal
User
Beiträge: 3
Registriert: Montag 29. Dezember 2014, 17:59

Okay danke ich würde es jetzt mit seek() machen können, aber es wird dadurch nicht schneller. Ich werde mir etwas anderes überlegen müssen ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ragyal hat geschrieben: ... aber letztendlich brauche ich beim Starten nur die letzte Zahl aus der Datei.
...
Hat da jemand einen Tipp für mich?
Wieso speicherst Du Dir dann nicht einfach nur *eine* Zahl? :K

Sollte es tatsächlich ein Performance-Problem geben, Du aber *alle* Zahlen benötigst, dann speicher halt *zwei* Dateien; in einer hängst Du alles an, die andere hält eben nur die letzte, für den nächsten Start benötigte Zahl...

Als letztes fiele mir eine Datenbank basierte Lösung ein... die Dinger sind spezialisiert auf schnellen Zugriff auf Daten :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Ragyal: Wenn es dadurch nicht schneller wird, dann war es von anfang an nicht zu langsam. Vielleicht solltest Du vor weiteren Versuchen erst einmal profilen wo die Zeit *tatsächlich* verbraucht wird.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Wieso wird das nicht schneller? Anstatt linear die Liste durchzugehen, brauchst du nur konstante Zeit.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

darktrym hat geschrieben:Wieso wird das nicht schneller? Anstatt linear die Liste durchzugehen, brauchst du nur konstante Zeit.
Vielleicht weil der OP an der falschen Stelle den Flaschenhals vermutet hat :K Ging das Einlesen vorher schon schnell, so "merkt" er natürlich nichts, sofern das IO nicht das Problem war :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Sollte es sich tatsächlich, wie es aussieht, um Primzahlen handeln, dann ist die gezeigt Datei gerade mal 150KB groß und beinhaltet gut 22000 Zahlen. Ich weiß jetzt nicht, ob es schneller wäre, die Zahl einfach zu berechnen, aber auch das lineare Lesen dürft in nicht-spürbarer Zeit erledigt sein.
BlackJack

Wobei es sich ja um einen Raspi handelt, also das Lesen sehr wahrscheinlich einer SD-Karte involviert. Da kann das Lesen beim Messen vielleicht tatsächlich der Teil des Programms sein in dem am meisten Zeit verbraucht wird. :-)
Antworten