martedì 27 marzo 2012

Split di un file e task in background

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