Textdatei am schnellsten sortieren, bash, php, python, C ?
Textdatei am schnellsten sortieren, bash, php, python, C ?
Weiss einer von euch, was am schnellsten ist zum sortieren nach 0-9 und A-Z und doppelte Einträge entfernen?
bash , php oder python, ..notfalls auch C
Angenommen man hat eine Textdatei mit ca. 100000, (gemischtes Verhältnis), IP-Adressen, Domainname und subdomainname.domainname.endung alles in einer Datei, Zeile für Zeile, durcheinander gewürfelt. Welche "Sprache" wäre da am schnellsten auf einem Single Core Prozessor um diese Textdatei, 1.) doppelte Einträge entfernen und 2.) Sortieren nach [0-9], und [A-Z] ?
Danke
bash , php oder python, ..notfalls auch C
Angenommen man hat eine Textdatei mit ca. 100000, (gemischtes Verhältnis), IP-Adressen, Domainname und subdomainname.domainname.endung alles in einer Datei, Zeile für Zeile, durcheinander gewürfelt. Welche "Sprache" wäre da am schnellsten auf einem Single Core Prozessor um diese Textdatei, 1.) doppelte Einträge entfernen und 2.) Sortieren nach [0-9], und [A-Z] ?
Danke
Re: Textdatei am schnellsten sortieren, bash, php, python, C
bash. Du nimmst das in C gschriebene sort -u, und die heben wesentlich mehr Gehirnschmalz reingesteckt als du je machen würdest.
Sost dürfte das schnellste String Handling in C++ möglich sein. Da muss man aber sehr gut wissen, was man tut.
Sost dürfte das schnellste String Handling in C++ möglich sein. Da muss man aber sehr gut wissen, was man tut.
rot: Moderator wanne spricht, default: User wanne spricht.
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Die Ausgabe von sort kann man nach uniq pipen, um doppelte Einträge zu eliminieren.
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Bei mir liefert sort | uniq tatsächlich merklich andere ergebnisse als
sort -u
Bei vollständig zufälligen Daten liegt sort -u aber vorn.
sort -u
Bei vollständig zufälligen Daten liegt sort -u aber vorn.
rot: Moderator wanne spricht, default: User wanne spricht.
- Lord_Carlos
- Beiträge: 5578
- Registriert: 30.04.2006 17:58:52
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Dänemark
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Wenn es sich nur um 100000 eintraege handelt, ist es dann nicht fast egal?
Code: Alles auswählen
╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Mit ``anderen Ergebnissen'' meinst du aber andere Laufzeiten, nicht etwa andere Ausgaben, oder? Sonst waere ich doch sehr irritiert.wanne hat geschrieben:Bei mir liefert sort | uniq tatsächlich merklich andere ergebnisse als
sort -u
@ren22: Geht es dir um ein praktisches Problem oder um die akademische Frage? Wenn ersteres, dann verwende ``sort -u'' und denk nicht mehr drueber nach. Wenn zweiteres, dann sollten hier harte Fakten, wie Zeitperformance-Messungen und Code-Analysen gepostet werden, weil anderes nicht weiter hilft.
Use ed once in a while!
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Etwas Offtopic da ja explizit nach A-Z0-9 gefragt war:
I.
Mit sort und uniq (und überhaupt allem was coreutils ist) wäre ich sehr vorsichtig: je nach locale gibts da lustige Ergebnisse z.B. bei doublewide chars.
II.
@Wanne: warum glaubst Du, dass man aus C++ hier effizienteren Code erzeugt als in z.B. C? Bei der oben genannten Anforderung (PlainASCII ohne Sonderzeichen und Maskierungen) würde ich eher zusätzlichen Overhead erwarten, insbesondere wenn man da Objektorientiert draufkloppt.
I.
Mit sort und uniq (und überhaupt allem was coreutils ist) wäre ich sehr vorsichtig: je nach locale gibts da lustige Ergebnisse z.B. bei doublewide chars.
Code: Alles auswählen
echo -e "カ\nキ\nク\nケ\nコ" |sort
echo -e "カ\nキ\nク\nケ\nコ" |sort -u
echo -e "カ\nキ\nク\nケ\nコ" |sort | uniq
@Wanne: warum glaubst Du, dass man aus C++ hier effizienteren Code erzeugt als in z.B. C? Bei der oben genannten Anforderung (PlainASCII ohne Sonderzeichen und Maskierungen) würde ich eher zusätzlichen Overhead erwarten, insbesondere wenn man da Objektorientiert draufkloppt.
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Das optimiert der Compiler bestimmt alles wegwürde ich eher zusätzlichen Overhead erwarten, insbesondere wenn man da Objektorientiert draufkloppt.
Re: Textdatei am schnellsten sortieren, bash, php, python, C
So soll das ja auch sein -- wenn es das falsche Locale ist, dann ist die Sortierreihenfolge ggf. eine andere.eggy hat geschrieben:je nach locale gibts da lustige Ergebnisse
Dass nicht alle Implementierungen vollstaendig internationalisiert sind, ist aber natuerlich ein Problem.
Use ed once in a while!
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Vergleiche mal
mit
Mein normalo-user bekommt die "de_DE.utf8", damit 'date' nicht umgewöhnungsbedürftig wird
root hingegen hat "C.utf8", und damit tritt auch das von eggy beschriebene lustige Phänomen der doublewide chars nicht auf.
Code: Alles auswählen
$ time sort -u blub > blob
Code: Alles auswählen
$ time LC_ALL=C sort -u blub > blob
root hingegen hat "C.utf8", und damit tritt auch das von eggy beschriebene lustige Phänomen der doublewide chars nicht auf.
Re: Textdatei am schnellsten sortieren, bash, php, python, C
@Meillo: Ja, soweit das die Reihenfolge angeht, völlig ok und da halte ich "unterschiedliches Verhalten" auch für nen Feature.
Aber hier geht es nicht um "A kommt vor Z im Alphabet" sondern um "A und B sind zwei unterschiedliche Zeichen".
Das Beispiel von oben sind japanische Katakana, dabei ist z.B. カ ein "ka" und キ ein "ki". Die Kana sind ein sogenanntes Silbenalphabet.
Angenommen wir würden so ähnlich schreiben, für "Hund" und "Hand" statt "H"-"u"-"n"-"d" oder "H"-"a"-"n"-"d" dann "Hu"-"nd" oder "Ha"-"nd" und sort -u betrachtet hier auch nur jeweils den ersten von den zwei Buchstaben:
aus
echo -e "Hand\nHund" |sort -u
Hand
Hund
würde damit
echo -e "Hn\nHn" | sort -u
Hn
tja schon irgendwie "lustig". (Und ja, der Bug ist bereits in mehreren Varianten bei unterschiedlichen Distributionen gemeldet und auch Upstream bekannt. Würde wahrscheinlich auf nen kompletten rewrite der coreutils hinauslaufen, mit all den tollen Seiteneffekten die sowas mit sich bringt)
@dufty: Dass man das Problem umgehen kann ist mir bewusst, aber dazu muss man ja erstmal wissen, dass es überhaupt ein Problem gibt
Aber hier geht es nicht um "A kommt vor Z im Alphabet" sondern um "A und B sind zwei unterschiedliche Zeichen".
Das Beispiel von oben sind japanische Katakana, dabei ist z.B. カ ein "ka" und キ ein "ki". Die Kana sind ein sogenanntes Silbenalphabet.
Angenommen wir würden so ähnlich schreiben, für "Hund" und "Hand" statt "H"-"u"-"n"-"d" oder "H"-"a"-"n"-"d" dann "Hu"-"nd" oder "Ha"-"nd" und sort -u betrachtet hier auch nur jeweils den ersten von den zwei Buchstaben:
aus
echo -e "Hand\nHund" |sort -u
Hand
Hund
würde damit
echo -e "Hn\nHn" | sort -u
Hn
tja schon irgendwie "lustig". (Und ja, der Bug ist bereits in mehreren Varianten bei unterschiedlichen Distributionen gemeldet und auch Upstream bekannt. Würde wahrscheinlich auf nen kompletten rewrite der coreutils hinauslaufen, mit all den tollen Seiteneffekten die sowas mit sich bringt)
@dufty: Dass man das Problem umgehen kann ist mir bewusst, aber dazu muss man ja erstmal wissen, dass es überhaupt ein Problem gibt
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Darum gibt es nicht nur LC_ALL sondern die Unterscheidung zwischen LC_TIME und LC_COLLATE.dufty2 hat geschrieben: Mein normalo-user bekommt die "de_DE.utf8", damit 'date' nicht umgewöhnungsbedürftig wird
Vielleicht bin ich ja zu sehr ein Theoretiker, aber wenn man das gewuenschte Locale gewaehlt hat und dieses korrekt implementiert ist und die verwendete sort-Implementierung dieses korrekt verwendet, dann bekommt man das richtige Ergebnis. Wenn eine der Implementierung falsch ist, dann ist das ein Bug. Wenn man das falsche Locale gewaehlt hat, dann ist man selber schuld.
Hab mir zumindest die Muehe gemacht, GNU uniq mit Heirloom uniq zu vergleichen:
Code: Alles auswählen
:-Q locale | grep LC_COLLATE
LC_COLLATE="en_US.UTF-8"
:-Q printf "カ\nキ\nク\nケ\nコ\n" |uniq # GNU
カ
:-Q printf "カ\nキ\nク\nケ\nコ\n" |./uniq # Heirloom
カ
キ
ク
ケ
コ
Use ed once in a while!
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Wenn man mit zu viel Objektorientierung drauf kloppt ist natürlich Schluss.eggy hat geschrieben:@Wanne: warum glaubst Du, dass man aus C++ hier effizienteren Code erzeugt als in z.B. C? Bei der oben genannten Anforderung (PlainASCII ohne Sonderzeichen und Maskierungen) würde ich eher zusätzlichen Overhead erwarten, insbesondere wenn man da Objektorientiert draufkloppt.
Die strings (Falls da viel ausländische URLs drin sind vielleicht auch u16string schneler) sollte man deutlich schneller arbeiten können als mit den komischen C Dingern.
Wahrscheinlich ist man aber am schnellsten, wenn man sich sowas in C selbst baut.
Ich sehe das anders. en_US enthällt halt kein カ entsprechend darf man da solche Fälle wegoptimieren. Das hast dann du verkackt.Meillo hat geschrieben:Fazit: GNU uniq ist nicht UTF-8-faehig. Irgendwie hat mich das nicht ueberrascht ... Man muss halt eine ordentliche Implementierung nehmen. Die GNU-Tools sind in der Hinsicht leider ziemlich hinten dran.
Code: Alles auswählen
export LC_COLLATE="ja_JP.UTF-8"
printf "カ\nキ\nク\nケ\nコ\n" | uniq
カ
キ
ク
ケ
コ
Btw. ist der C.UTF-8 deutlich schneller als der en_US.UTF-8. Was mich jetzt schon wieder an den GNU Leuten zweifeln lässt. Kann der C.UTF-8 nicht schlicht nur mehr?
rot: Moderator wanne spricht, default: User wanne spricht.
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Da hast du Recht, wir haben unterschiedliche Meinungen dazu.wanne hat geschrieben:Ich sehe das anders. en_US enthällt halt kein カ entsprechend darf man da solche Fälle wegoptimieren.Meillo hat geschrieben:Fazit: GNU uniq ist nicht UTF-8-faehig. Irgendwie hat mich das nicht ueberrascht ... Man muss halt eine ordentliche Implementierung nehmen. Die GNU-Tools sind in der Hinsicht leider ziemlich hinten dran.
IMO darf uniq(1) nicht einfach alle Zeichen, die nicht Teil der gewaehlten Sprache sind, als identisch werten. Vielmehr muesste es sie als unverstanden ansehen und damit das einzig Sinnvolle tun was moeglich ist, naemlich ihre Codepoints zu vergleichen. Das passiert aber nicht.
btw: Auch in einem deutschsprachigen Buch koennen japanische Zeichen vorkommen, wenn ich davon die Zeichenhaeufigkeit auswerten will (wozu ich uniq(1) brauche) sollen diese ebenso aufgefuehrt sein, keinesfalls aber ignoriert werden, bloss weil ich ein deutsches Locale verwende.
Edit: Wie sollten denn U+1F384 und U+1F389 behandelt werden? Sind das englische Zeichen?
Bei mir nicht (GNU uniq 8.13).Willst du eine saubere vollständige UTF-8 Implementierung musst du C.UTF-8 nehmen. Auch der funktioniert wie gewünscht.
Use ed once in a while!
Re: Textdatei am schnellsten sortieren, bash, php, python, C
Die jessie coreutils (8.23) können es.
Mit dem Weihnachtsbaum bekommt man sie dann aber auch.
Aber da stürzt auch das Forum ab
Mit dem Weihnachtsbaum bekommt man sie dann aber auch.
Aber da stürzt auch das Forum ab
rot: Moderator wanne spricht, default: User wanne spricht.