Große Dateien mit Python verarbeiten

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
DrChAoS
User
Beiträge: 14
Registriert: Montag 10. März 2008, 16:29

Montag 7. Juli 2008, 20:33

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
BlackJack

Montag 7. Juli 2008, 21:42

Was ist denn nun das Problem!? Solange man die Datei nicht komplett in den Speicher liesst, kommt Python prima mit so grossen Dateien klar.
DrChAoS
User
Beiträge: 14
Registriert: Montag 10. März 2008, 16:29

Montag 7. Juli 2008, 21:45

Das Problem ist dass ich dann folgendes Ergebnis beim Auslesen bekomme:
Ich dachte Auch dass es so geht. tut es aber leider nicht.
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 7. Juli 2008, 22:11

Schau dir mal cStringIO bzw. StringIO und in diesem Zusammenhang nochmal open().
DrChAoS
User
Beiträge: 14
Registriert: Montag 10. März 2008, 16:29

Montag 7. Juli 2008, 22:46

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
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Dienstag 8. Juli 2008, 06:36

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
DrChAoS
User
Beiträge: 14
Registriert: Montag 10. März 2008, 16:29

Dienstag 8. Juli 2008, 08:53

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 8. Juli 2008, 09:45

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DrChAoS
User
Beiträge: 14
Registriert: Montag 10. März 2008, 16:29

Dienstag 8. Juli 2008, 09:56

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
Antworten