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 .
Für das Auslesen nehme ich readlines() und split() (geschlossen wird das txt file auch vorschriftsmäßig)
Mit kleinen Files funktioniert mein Code
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
großem txt files einlesen --> ram overflow
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Schon mal ausprobiert?acidk hat geschrieben:und das Wichtigste: kann ich LISTEN pickeln (kenne das nur von strings) o.ä. um sie aus dem Ram zu bekommen?
Achja, Tuples sind speicherschonender als Listen, da ihre Länge feststeht und sie nicht überalloziiert sind.
Lies doch mal den Abschnitt im Tutorial: http://docs.python.org/tutorial/inputou ... ting-filesacidk 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
Meine Fragen:
Gibt es eine effizientere Methode txt files auszulesen als mit readlines?
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:
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.
Code: Alles auswählen
for data in iter(lambda: file_object.read(2 ** 10), ""):
...
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.
Danke für Eure schnellen Antworten!
Beispiel von hier:
http://docs.python.org/library/pickle.h ... ule-pickle
i
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....
Ich hab mich mal mit dem Pickeln (okay - nicht lustig) versucht:Leonidas hat geschrieben:Schon mal ausprobiert?acidk hat geschrieben:und das Wichtigste: kann ich LISTEN pickeln (kenne das nur von strings) o.ä. um sie aus dem Ram zu bekommen?
Achja, Tuples sind speicherschonender als Listen, da ihre Länge feststeht und sie nicht überalloziiert sind.
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()
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....
Schau doch mal wie Dein Modul heisst, und was da wohl importiert wird, wenn Du ``import pickle`` schreibst.