Seite 1 von 1

Große Dateien mit Python verarbeiten

Verfasst: Montag 7. Juli 2008, 20:33
von DrChAoS
Guten Abend,
Ich habe gestern versucht eine 2GB große Datei in eine MySQL Datenbank einzulesen. Leider habe ich festgestellt dass Python anscheinend bei größeren Dateien Probleme bekommt. Hier mein verwendetes Script. Ich habe den Teil mit MySQL weggelassen, aber so erscheint genau das selbe Ergebnis:

Code: Alles auswählen

#!/usr/local/bin/python

inp = open("grosse_datei.txt","r")
out = open("andere_datei.txt","a+")
for i in range(1,10):
	line = inp.readline()
	print line
	out.write(line)
out.close()
inp.close()
Kann mir jemand sagen wie ich eine 2GB bis ca 50GB Große Datei auslesen und verarbeiten bzw wieder in eine andere Datei schreiben kann?
MfG
Dr.ChAoS

Verfasst: Montag 7. Juli 2008, 21:42
von BlackJack
Was ist denn nun das Problem!? Solange man die Datei nicht komplett in den Speicher liesst, kommt Python prima mit so grossen Dateien klar.

Verfasst: Montag 7. Juli 2008, 21:45
von DrChAoS
Das Problem ist dass ich dann folgendes Ergebnis beim Auslesen bekomme:
Ich dachte Auch dass es so geht. tut es aber leider nicht.

Verfasst: Montag 7. Juli 2008, 22:11
von DasIch
Schau dir mal cStringIO bzw. StringIO und in diesem Zusammenhang nochmal open().

Verfasst: Montag 7. Juli 2008, 22:46
von DrChAoS
Oh jetzt kommts.... diese verdammte 2GB große Datei bestand nur aus LEERZEILEN. Also Python hat alles korrekt gemacht. Ich kann das zwar nicht direkt überprüfen ob das auch wirklich so ist, aber wenn es bei anderen noch sehr viel größeren Dateien klappt dann kann man davon ausgehen denke ich mal.
Trotzdem Danke für eure Mühe.
MfG
Dr.ChAoS

Verfasst: Dienstag 8. Juli 2008, 06:36
von Michael Schneider
DrChAoS hat geschrieben:Oh jetzt kommts.... diese verdammte 2GB große Datei bestand nur aus LEERZEILEN.
Hallo,

Du machst Deinem Nick ja alle Ehre. ;-)
Wenn Du den Inhalt beim nächsten mal prüfen möchtest, verwende doch am besten die Repräsentation, dann werden nicht nur nicht-druckbare Zeichen ausgegeben, sondern Du merkst auch, wenn es Leerstrings sind:

Code: Alles auswählen

>>> s = "test"
>>> print s
test
>>> print repr(s)
'test'
Und sollten Deine 2GB Dateien zufällig auch binärcode enthalten, dann solltest Du sie unbedingt im Binärmodus ("rb" statt "r" und "wb" statt "w") öffnen, sonst wird der Inhalt evtl. beim Einlesen oder Speichern interpretiert.

Gruß,
Michael

Verfasst: Dienstag 8. Juli 2008, 08:53
von DrChAoS
Michael Schneider hat geschrieben:Du machst Deinem Nick ja alle Ehre. ;-)
Manchmal leider zu oft^^.

Danke für den Tipp, ich werds mir merken für das nächste Mal.
MfG

Re: Große Dateien mit Python verarbeiten

Verfasst: Dienstag 8. Juli 2008, 09:45
von jens
DrChAoS hat geschrieben:Ich habe gestern versucht eine 2GB große Datei in eine MySQL Datenbank einzulesen. Leider habe ich festgestellt dass Python anscheinend bei größeren Dateien Probleme bekommt.
Wenn du einen großen SQL Dump einspielen willst, machst du das am besten direkt mit dem MySQL Kommantozeilen tools. Das ist die schnellste Variante. Ich hatte das mal selber getestet. Es macht keinen Sinn die Daten erst in Python einzulesen und anschließend der Datenbank zu verfüttern...

Verfasst: Dienstag 8. Juli 2008, 09:56
von DrChAoS
Ja das habe ich auch getan nachdem ich mit PHP 3 Tage für 500000 Einträge gebraucht habe^^. Python hat nur die Wörter in ein SQL Format gebracht, was übrigends auch sehr viel schneller als mit PHP ging.
MfG
Dr.ChAoS