Sto valutando se GNU Parallel può essere utilizzato per cercare i file memorizzati su un sistema in parallelo. Può esserci un solo file per ogni giorno dell'anno (doy) sul sistema (quindi un massimo di 366 file all'anno). Diciamo che ci sono 3660 file sul sistema (circa 10 anni di dati). Il sistema potrebbe essere un Linux multi-core multi-CPU o un Solaris multi-CPU.Come nutrire una vasta gamma di comandi su GNU Parallel?
Sto memorizzando i comandi di ricerca per l'esecuzione sui file in un array (un comando per file). E questo è quello che sto facendo in questo momento (utilizzando bash), ma poi non ho alcun controllo su quante ricerche per avviare in parallelo (sicuramente non vuole ricominciare tutto 3660 le ricerche in una volta):
#!/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
Se dovessi usare parallel
(che calcolerà automaticamente il numero massimo di CPU/core e avviare solo così tante ricerche in parallelo), come posso riutilizzare l'array cmds
con il parallelo e riscrivere il codice precedente? L'altra alternativa è di scrivere tutti i comandi in un file e poi fare cat cmd_file | parallel
Per essere pedante, nel mio universo 10 anni non possono produrre 3660 file poiché non ci possono essere 10 anni bisestili consecutivi. Ma dal momento che hai scritto "about" presumo tu lo sappia e non guardi il mio da un universo parallelo (che mi rattrista un po ') ;-) –
@Adrian Hai ragione; Ho aggiunto "about" per tenere conto degli anni bisestili :) –