Seite 1 von 1

großem txt files einlesen --> ram overflow

Verfasst: Mittwoch 4. Februar 2009, 21:48
von acidk
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

Re: großem txt files einlesen --> ram overflow

Verfasst: Mittwoch 4. Februar 2009, 21:52
von Leonidas
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.

Re: großem txt files einlesen --> ram overflow

Verfasst: Mittwoch 4. Februar 2009, 21:53
von numerix
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

Verfasst: Mittwoch 4. Februar 2009, 22:09
von str1442
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.

Re: großem txt files einlesen --> ram overflow

Verfasst: Mittwoch 4. Februar 2009, 23:23
von acidk
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....

Verfasst: Mittwoch 4. Februar 2009, 23:25
von BlackJack
Schau doch mal wie Dein Modul heisst, und was da wohl importiert wird, wenn Du ``import pickle`` schreibst. ;-)

Verfasst: Mittwoch 4. Februar 2009, 23:57
von acidk
BlackJack hat geschrieben:Schau doch mal wie Dein Modul heisst, und was da wohl importiert wird, wenn Du ``import pickle`` schreibst. ;-)
:? ich checks nicht!

Verfasst: Donnerstag 5. Februar 2009, 00:02
von Leonidas
Du importierst die Datei die du gerade ausführst. Und die hat die Methoden logischerweise nicht definiert.

Verfasst: Donnerstag 5. Februar 2009, 00:14
von acidk
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: