Ich muss viele ähnliche Befehle in möglichst kurzer Zeit und unter Verwendung aller verfügbaren Ressourcen ausführen.
In meinem Fall verarbeite ich beispielsweise Bilder, wenn ich den folgenden Befehl verwende:
for INPUT in *.jpg do; some_command; done
Der Befehl wird einzeln ausgeführt und verwendet nicht alle verfügbaren Ressourcen.
Andererseits for INPUT in *.jpg do; some_command &; done
führt die Ausführung jedoch dazu, dass der Maschine innerhalb kürzester Zeit die Ressourcen ausgehen.
Ich kenne at
den batch
Befehl, bin mir aber nicht sicher, ob ich ihn in meinem Fall verwenden kann. Korrigieren Sie mich, wenn ich falsch liege.
Ich habe also darüber nachgedacht, die Befehle in eine Art Warteschlange zu stellen und nur einen Teil davon auf einmal auszuführen. Ich weiß nicht, wie ich das schnell machen soll, und das ist das Problem. Ich bin sicher, dass jemand schon einmal auf ein ähnliches Problem gestoßen ist.
Bitte beraten.
Antwort1
GNU Parallel ist genau dafür gemacht:
parallel some_command {} ::: *.jpg
Standardmäßig ist ein Job pro CPU-Kern verfügbar. In Ihrem Fall möchten Sie möglicherweise einen Job mehr ausführen, als Sie Kerne haben:
parallel -j+1 some_command {} ::: *.jpg
GNU Parallel ist ein allgemeiner Parallelisierer und erleichtert die parallele Ausführung von Jobs auf derselben Maschine oder auf mehreren Maschinen, auf die Sie per SSH-Zugriff zugreifen können.
Wenn Sie 32 verschiedene Jobs haben, die Sie auf 4 CPUs ausführen möchten, können Sie die Parallelisierung ganz einfach durchführen, indem Sie auf jeder CPU 8 Jobs ausführen:
GNU Parallel startet stattdessen einen neuen Prozess, wenn einer fertig ist – wodurch die CPUs aktiv bleiben und Zeit gespart wird:
Installation
Aus Sicherheitsgründen sollten Sie GNU Parallel mit Ihrem Paketmanager installieren. Wenn GNU Parallel jedoch nicht für Ihre Distribution gepackt ist, können Sie eine persönliche Installation durchführen, für die kein Root-Zugriff erforderlich ist. Dies ist in 10 Sekunden erledigt, indem Sie Folgendes tun:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Weitere Installationsoptionen finden Sie unterhttp://git.savannah.gnu.org/cgit/parallel.git/tree/README
Erfahren Sie mehr
Weitere Beispiele:http://www.gnu.org/software/parallel/man.html
Sehen Sie sich die Einführungsvideos an:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Gehen Sie das Tutorial durch:http://www.gnu.org/software/parallel/parallel_tutorial.html
Melden Sie sich für die E-Mail-Liste an, um Unterstützung zu erhalten:https://lists.gnu.org/mailman/listinfo/parallel
Antwort2
Sie können GNU make mit der --jobs
Option verwenden, Dinge parallel auszuführen, jedoch auf die angegebene Anzahl von Jobs beschränkt. Sie können diese Zahl so anpassen, dass Ihr Rechner nicht kaputtgeht.
Hier ist ein Beispiel für ein Makefile, das Ziele verwendet (das könnten beispielsweise Ihre Ausgabedateien sein) und für jedes Ziel einen (Dummy-)Befehlssatz ausführt:
all: a b c d e f g h
a b c d e f g h:
echo $@; sleep 10
NB Die Einrückung des Befehlsmussein TAB-Zeichen sein. Siehe dieGNU make-Dokumentationfür Details zur Syntax von Makefiles.
Sie können make aufrufen make --jobs 4
und erhalten die folgende Ausgabe (ich habe die time make --jobs 4
folgende verwendet, um die verstrichene Zeit anzuzeigen):
echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h
real 0m20.009s
user 0m0.010s
sys 0m0.011s
Die ersten vier wurden parallel ausgeführt, dann die nächsten vier, sodass die gesamte verstrichene Zeit 20 Sekunden beträgt.