Multithreading eines Bash-Skripts

2552
Liviu ZeJah

Ich habe eine 8-GB-TXT-Datei und muss für jede Zeile in der Datei ein Python-Skript ausführen und einen Teil der Ausgabe speichern.

Gibt es eine Möglichkeit, dies in mehrere Prozesse aufzuteilen, damit es schneller läuft, in bash?

Hier ist mein aktuelles bash-Skript:

#!/bin/bash filename='before.txt' while read p; do  python py-hex.py $p | sed -n -e '/^qter/p' | sed 's/qter: //g' >> converted.txt done < $filename 
0

1 Antwort auf die Frage

2
davidgo

Ich denke, Sie müssen mehr Details zu den Grenzwerten angeben. Muss die Ausgabe in convert.txt in der gleichen Reihenfolge sein wie 'before.txt', wie lange dauert jede Analyse des Python-Skripts? Wenn die Ausgabereihenfolge nicht von der Eingabe abhängt, können Sie dies möglicherweise tun, indem Sie die Prozesse in den Hintergrund stellen und in jeder Schleife eine Anzahl von Prozessen starten. Die Anzahl hängt vermutlich von der Anzahl der Threads ab, die von Ihrer CPU verarbeitet werden.

Etwas wie das Folgende könnte (oder auch nicht) für Ihren Zweck geeignet sein:

#! /bin/bash threads=4;  threads=$(( $threads - 1)) while read filein do python py-hex.py $filein | sed -n -e '/^qter/p' | sed 's/qter: //g' >> converted.txt & for thread in `seq $threads` do read filein  python py-hex.py $filein | sed -n -e '/^qter/p' | sed 's/qter: //g' >> converted.txt & done done < $filename 

Hinweise: Dies setzt voraus, dass Ihre Python-Datei leere Eingaben verarbeiten kann (dh, wenn die Anzahl der Befehle nicht genau durch die Anzahl der Threads teilbar ist, werden einige leere Zeilen angezeigt. Sie können dies immer überprüfen, bevor Sie die innere Schleife ausführen.)

Dieses Skript setzt voraus, dass Sie sich nicht für die Ausgabereihenfolge interessieren.

ja so etwas. funktioniert super . testet dies immer noch, aber es scheint etwas schneller zu funktionieren. danke für Ihre Hilfe! Liviu ZeJah vor 8 Jahren 0