großem txt files einlesen --> ram overflow

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
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Hallo Leute!

Ich bin dabei Messwerte aus großen (~100MB txt Dateien) auszulesen , diese in vier Listen zu organisieren (da vier verschieden Eigenschaften) und im Anschluß diese vier Sub Listen zu sortieren (aufsteigend nach dem ersten Wert).

Zusammensetzung eines Listeneintrages ist : Meßwert/ x/y/z Koordinaten

Die Listen verwende ich dann für weitere Berechnungen.

Das ganze mache ich in einer Schleife für 85 Strukturen -- tja --- und dann läuft mir der Ram über :roll: .

Für das Auslesen nehme ich readlines() und split() (geschlossen wird das txt file auch vorschriftsmäßig)

Mit kleinen Files funktioniert mein Code :wink:

Meine Fragen:

Gibt es eine effizientere Methode txt files auszulesen als mit readlines?

Sind Listen Ressourcen schonender als tuples oder arrays oder bietet sich eine andere Datenstruktur an?

Da ich in einer Loop die entsprechende Funktion aufrufe, sollten die Listen immer wieder überschrieben werden -- wieso läuft mein Ram über?

und das Wichtigste: kann ich LISTEN pickeln (kenne das nur von strings) o.ä. um sie aus dem Ram zu bekommen?

Besten Dank,
flo
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

acidk hat geschrieben:und das Wichtigste: kann ich LISTEN pickeln (kenne das nur von strings) o.ä. um sie aus dem Ram zu bekommen?
Schon mal ausprobiert?

Achja, Tuples sind speicherschonender als Listen, da ihre Länge feststeht und sie nicht überalloziiert sind.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

acidk hat geschrieben:Für das Auslesen nehme ich readlines() und split() (geschlossen wird das txt file auch vorschriftsmäßig)

Mit kleinen Files funktioniert mein Code :wink:

Meine Fragen:

Gibt es eine effizientere Methode txt files auszulesen als mit readlines?
Lies doch mal den Abschnitt im Tutorial: http://docs.python.org/tutorial/inputou ... ting-files
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Du kannst direkt über ein Dateiobjekt iterieren. Damit liest du schonmal nichts komplett in den Speicher. Beim "normalen" Iterieren mittels for liefert man dir immer jeweils eine Zeile zurück, willst du mit größeren Blöcken arbeiten (und bist nicht auf die Zeilen angewiesen), finde ich dieses Konstrukt ganz hilfreich:

Code: Alles auswählen

for data in iter(lambda: file_object.read(2 ** 10), ""):
    ...
Das liest jeweils immer 1 Mb ein bis die Datei leer ist. Nutzt die zweite Variante, iter() zu benutzen.

Als nächstes musst du natürlich sehen, das du deine vier Listen auch wieder nach und nach aus dem Speicher kriegst, vielleicht mit dem "a" Modus eines Dateiobjektes.
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Danke für Eure schnellen Antworten!
Leonidas hat geschrieben:
acidk hat geschrieben:und das Wichtigste: kann ich LISTEN pickeln (kenne das nur von strings) o.ä. um sie aus dem Ram zu bekommen?
Schon mal ausprobiert?

Achja, Tuples sind speicherschonender als Listen, da ihre Länge feststeht und sie nicht überalloziiert sind.
Ich hab mich mal mit dem Pickeln (okay - nicht lustig) :D versucht:
Beispiel von hier:
http://docs.python.org/library/pickle.h ... ule-pickle

i

Code: Alles auswählen

mport pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

Die Error Meldung sieht folgendermassen aus:

flo@AKB-34:~/Desktop/grid_analysis$ python pickle.py
Traceback (most recent call last):
File "pickle.py", line 4, in <module>
import pickle
File "/home/flo/Desktop/grid_analysis/pickle.py", line 16, in <module>
pickle.dump(data1, output)
AttributeError: 'module' object has no attribute 'dump'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/apport_python_hook.py", line 38, in apport_excepthook
from apport.packaging_impl import impl as packaging
File "/usr/lib/python2.5/site-packages/apport/__init__.py", line 1, in <module>
from apport.report import Report
File "/usr/lib/python2.5/site-packages/apport/report.py", line 14, in <module>
import subprocess, tempfile, os.path, urllib, re, pwd, grp, os, sys
File "/usr/lib/python2.5/subprocess.py", line 404, in <module>
import pickle
File "/home/flo/Desktop/grid_analysis/pickle.py", line 16, in <module>
pickle.dump(data1, output)
AttributeError: 'module' object has no attribute 'dump'

Original exception was:
Traceback (most recent call last):
File "pickle.py", line 4, in <module>
import pickle
File "/home/flo/Desktop/grid_analysis/pickle.py", line 16, in <module>
pickle.dump(data1, output)
AttributeError: 'module' object has no attribute 'dump'


Finde ich sehr merkwürdig -- habe ich irgendetwas übersehen / nicht importiert?
Ich benutze Ubuntu 8.10 -- aber das spielt wohl eher eine untergeordnete Rolle bei der Fehlersuche....
BlackJack

Schau doch mal wie Dein Modul heisst, und was da wohl importiert wird, wenn Du ``import pickle`` schreibst. ;-)
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

BlackJack hat geschrieben:Schau doch mal wie Dein Modul heisst, und was da wohl importiert wird, wenn Du ``import pickle`` schreibst. ;-)
:? ich checks nicht!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du importierst die Datei die du gerade ausführst. Und die hat die Methoden logischerweise nicht definiert.
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Leonidas hat geschrieben:Du importierst die Datei die du gerade ausführst. Und die hat die Methoden logischerweise nicht definiert.


Danke! ... zeit ins Bett zu gehen... :roll:
Antworten