Mi sono trovato a dover elaborare dei grossi file di testo andando a fare delle operazioni che interrogavano un server web e che potevano quindi essere parallelizzate.
In pratica, dato il mio file di input ho utilizzato il comando "split" di unix per spezzarlo in file più piccoli e poi ho lanciato un loop per eseguire N volte il task parallelo in background.
Quanto erano piccoli i file ottenuti con lo split? Erano file proporzionali alla dimensione del mio input e funzionali al numero massimo di thread paralleli che volevo eseguire.
Vediamo lo script:
# Il numero di task paralleli che voglio avviare, il prefisso usato per i nomi dei file e la cartella di lavoro
THREAD=5
FILE_PREFIX="split_"
SPLIT_DIR="split/"
# Conta le righe del file di input
LINES=`cat $FILE_INPUT | wc -l`
# Ricava MAX_LINES rispetto al numero di thread per il singolo file usando il tristissimo comando "bc"
MAX_LINES=`echo "$LINES / $THREAD" | bc`
# Effettua lo split
split -d -l $MAX_LINES $FILE_INPUT $SPLIT_DIR$FILE_PREFIX
id=0
for task in `ls $SPLIT_DIR`
do
./task.sh $SPLIT_DIR$task $id &bg
id=`expr $id + 1`
done
Semplice ed efficace!
Nessun commento:
Posta un commento