Sehr großes File lesen

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
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Hallo!

Ich versuche derzeit in python ein 13GB großes File zeilenweise auszulesen.

Es funktioniert auch prächtig, jedoch sagt er mir dass es nur 1124259 Zeilen gibt. Es müssen aber definitiv mehr sein. Ich kann es leider nicht genau überprüfen, aber es sollten laut Veröffentlichung des files 97 Millionen Zeilen sein.

Hat hier wer ne Idee was schief laufen könnte?

lg
Philipp
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo,

etwas vergleichbares gabs schonmal vor ein paar Wochen und woran es eventuell liegen könnte ist, dass
wenn du auf einem 32 Bit System entwickelst bzw. deine Python Runtime eine solche ist, du eine
Speicherbegrenzung pro Prozess von 2 GB (unter Windows) hast. D.h. ein windows Prozess bekommt
standardmässig nur 2 GB virtuell address-space mit dem er arbeiten kann.

Aber um sowas zu entscheiden müsste man wissen wo die Zeilen eingelesen werden und ob so die
Speicherstrukturen an eine Grenze stoßen.
An sich sollte auch eine Exception kommen, welche evtl. verschluckt wird?

Grüße

stefan
BlackJack

@Killver: Ohne Quelltext kann man da nicht viel sagen. Vielleicht ist ja auch was mit der Berechnung der Zeilenanzahl falsch!? "Er sagt"? Wer und wie kommt "er" zu der Zeilenanzahl?
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Es handelt sich um einen twitter Datensatz der definitiv laut Veröffentlichung 97 Millionen zeilen haben muss.

Ich arbeite mit einer 32bit evrsion von python.

Folgenden Code verwende ich:

Code: Alles auswählen

f = file("twitterStream.data", "r")

for line in f:
   do something
BlackJack

@Killver: Und wo wird da eine Zeilenanzahl ausgegeben? Bzw. was lässt Dich an der Ausgabe dieses Programms vermuten es war nicht alles?

Wohin lässt Du ausgeben?
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Ich lasse in die konsole ausgeben. Er liest definitiv zu wenig ein. merke ich auch beim speichern in eine Datenbank.

habe jetzt übrigends die Bestätigung:

über die Dos Konsole zeilen gezählt:


---------- C:\TWITTERSTREAM.DATA:
96371836
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Ich habe gerade mal eine Datei mit 99.999.999 (kurzen) Zeilen erstellt. Die werden ohne Probleme eingelesen - was ja auch zu erwarten war, da beim Iterieren über die Zeilen nicht der Speicher vollgemüllt wird (also ich lasse nur drüberlaufen und einen Zähler hochzählen).

Kurzum: Muss etwas in deinem Code sein - den du uns ja leider vorenthalten hast.

Gruß,

brb
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

ich habe meinen Code ja schon gepsotet
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dann solltest du aber einen Syntaxfehler bekommen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Code: Alles auswählen

linectr = 0
for line in open("twitter_stream.data", "r"):
      linectr += 1
print linectr
f.close()
Das wäre der ganze Code. mehr geschieht nicht.

Ich evrsuche gerade die Files zu splitte (derzeit auf 100mb parts) Aber er bekommt immer noch nicht die richtige Zeilenanzahl :D
BlackJack

@Killver: Was ist denn in der Datei enthalten? Können da auch "Binärdaten" in den Zeilen vorkommen? Bei Windows gibt es nämlich einen Bytewert, den dieses tolle Betriebssystem als Endkennzeichen für Textdateien interpretiert.
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Oh wie wäre denn dieser Bytewert?

Falls dieser irgendwo in der Datei sein sollte (was leicht sien kann), wie könnte ich das umgehen?

Es sind eigentlich nur Textzeilen vorhanden.

habe jetzt geschaut wo er sagt dass das file aus is: Im texteditor steht ein "SUB"
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ändert es was, wenn du das file mit rb öffnest?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Das wars tatsächlich... nun funktionierts, danke :)

Hätte ich mir 5 studnen herumprobieren sparen können ^^
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jbs hat geschrieben:Ändert es was, wenn du das file mit rb öffnest?
Es ist schon pervers Binärdateien zeilenweise zu lesen, aber wenn's dann jetzt funktioniert soll es recht sein.
Killver
User
Beiträge: 32
Registriert: Montag 12. Juli 2010, 17:03

Im grunde is es ja keine Binärdatei sondern nur Text, aber anscheinend haben sich Binärelemente darin evrsteckt. jetzt liest er jedenfalls alle Zeilen ein. Danke nochmals!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Killver hat geschrieben:Im grunde is es ja keine Binärdatei sondern nur Text, aber anscheinend haben sich Binärelemente darin evrsteckt. jetzt liest er jedenfalls alle Zeilen ein. Danke nochmals!
DOS/Windows reagiert eigentlich nur allergisch auf ^Z (ASCII 26) ein Überbleibsel aus CP/M. Eigentlich wundert es mich, dass Python das noch beachtet, denn AFAIK können sich DOS/Windows-Programme bei Dateioperationen aussuchen, ob sie CP/M-kompatibel sein wollen oder nicht.

Stefan
BlackJack

@sma: Python benutzt einfach die entsprechenden Funktionen aus der C-Standardbibliothek. Und bei denen verhält sich Windows halt so.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@sma: Python benutzt einfach die entsprechenden Funktionen aus der C-Standardbibliothek. Und bei denen verhält sich Windows halt so.
Also ist das ein spezifisches CPython-Problem? Wäre ja da mal interessant, ob sich dort Jython z.B. anders verhält :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten