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
Sehr großes File lesen
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
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
@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?
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:
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
@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?
Wohin lässt Du ausgeben?
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
habe jetzt übrigends die Bestätigung:
über die Dos Konsole zeilen gezählt:
---------- C:\TWITTERSTREAM.DATA:
96371836
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
Kurzum: Muss etwas in deinem Code sein - den du uns ja leider vorenthalten hast.
Gruß,
brb
Code: Alles auswählen
linectr = 0
for line in open("twitter_stream.data", "r"):
linectr += 1
print linectr
f.close()
Ich evrsuche gerade die Files zu splitte (derzeit auf 100mb parts) Aber er bekommt immer noch nicht die richtige Zeilenanzahl
@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.
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"
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"
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.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!
Stefan
@sma: Python benutzt einfach die entsprechenden Funktionen aus der C-Standardbibliothek. Und bei denen verhält sich Windows halt so.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also ist das ein spezifisches CPython-Problem? Wäre ja da mal interessant, ob sich dort Jython z.B. anders verhältBlackJack hat geschrieben:@sma: Python benutzt einfach die entsprechenden Funktionen aus der C-Standardbibliothek. Und bei denen verhält sich Windows halt so.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert