2016-04-19 5 views
2

sed Laufen wagte ich naiverweise den folgenden Befehl zu verwenden, um eine Datendatei zu verarbeiten:parallel

cat old.one | parallel --pipe 'sed -r "s/\./\,/g"' > new.one 

Ziel zu ersetzen war „“ mit ",". Aber die resultierende Datei unterscheidet aus, dass durch sequentielle Behandlung erhalten:

sed -r "s/\./\,/g" old.one > new.one 

Vielleicht können parallel arbeiten irgendwie anders gemacht werden? Hier wäre es gut, auf die Semaphore zu verzichten und die Teile erst am Ende zu kombinieren.

Lösung

Vielen Dank! Hier ist meine Ergebnisse:

  • sed: 13,834 s

    sed -r "s /./\,/ g" old.one> new.one

  • parallel sed: 12,489 s

    cat old.one | parallel -k --pipe 'sed -r "s /./\,/ g"'> new.one

  • tr: 6.480 s

    Katze old.one | tr "." ""> New.one

  • parallel tr: 5.848 s

    Katze new.one | parallel -k --pipe tr "." ","> old.one

+3

Sie beiden Ergebnisse und eine kleine Probe Ihrer Eingabedatei schreiben sollen (old.one) –

+0

Beachten Sie, dass Sie 'tr 'verwenden können.' ',' 'Um zwischen den Zeichen zu übersetzen, ist dies schneller als' sed 's /\./,/ g'' – andlrc

+0

Danke für den Hinweis. Tr funktioniert schneller. –

Antwort

2

Wenn dies korrekt funktioniert (-j1):

cat old.one | parallel -j1 --pipe 'sed -r "s/\./\,/g"' > new.one 

dann sollte dies (-k) arbeiten:

cat old.one | parallel -k --pipe 'sed -r "s/\./\,/g"' > new.one 

--pipe ist sehr langsam, so dass, wenn die Geschwindigkeit des Wesens ist , --pipe-Teil statt mit einer anständigen Blockgröße verwenden:

parallel -a old.one -k --block 30M --pipe-part 'sed -r "s/\./\,/g"' > new.one 
0

Dies scheint kein Problem besonders geeignet für die parallele Verarbeitung. Sie können jedoch die Originaldatei teilen, die Teile parallel verarbeiten und die Ergebnisse dann kombinieren.