Ich bewerte, ob verwendet werden kann, um parallel auf einem System gespeicherte Dateien zu suchen. Es kann nur eine Datei für jeden Tag des Jahres (Doy) auf dem System geben (also maximal 366 Dateien pro Jahr). Nehmen wir an, es gibt 3660 Dateien auf dem System (ungefähr 10 Jahre Daten). Das System könnte ein Multi-CPU-Multi-Core-Linux oder ein Multi-CPU-Solaris sein.Wie füge ich eine große Anzahl von Befehlen an GNU Parallel?
Ich speichere die Suchbefehle für die Dateien in einem Array (ein Befehl pro Datei). Und das ist, was ich jetzt mache (mit bash), aber dann habe ich keine Kontrolle darüber, wie viele Suchanfragen parallel zu starten (definitiv nicht wollen, alle 3660 sucht sofort beginnen):
#!/usr/bin/env bash
declare -a cmds
declare -i cmd_ctr=0
while [[ <condition> ]]; do
if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
cmds[$cmd_ctr]="<cmd_to_run>"
let cmd_ctr++
fi
done
declare -i arr_len=${#cmds[@]}
for ((i=0; i<${arr_len}; i++));
do
# Get the command and run it in background
eval ${cmds[$i]} &
done
wait
Wenn ich parallel
(das wird automatisch die max. CPUs/Kerne herausfinden und starten Sie nur so viele Suchen parallel), wie kann ich das Array cmds
mit parallel verwenden und den obigen Code neu schreiben? Die andere Alternative ist es, alle Befehle in eine Datei zu schreiben und dann cat cmd_file | parallel
Um pedantisch zu sein, kann in meinem Universum 10 Jahre nicht 3660 Dateien ergeben, da es nicht 10 aufeinander folgende Schaltjahre geben kann. Aber seit du "about" geschrieben hast, nehme ich an, dass du das weißt und schaue nicht in mein paralleles Universum (was mich ein bisschen traurig macht) ;-) –
@Adrian Du hast recht; Ich fügte 'ungefähr' hinzu, um Schaltjahre zu berücksichtigen :) –