Idee sull'elaborazione del file di testo di input in parallelo dallo script di Bash

2

Ho uno script Bash che elabora i file letti da input standard, un percorso per riga e esegue un'attività intensiva della CPU su ciascun file. Mi è capitato di notare che anche con quattro core ( grep -c ^processor /proc/cpuinfo ) veniva utilizzato solo circa il 25% del processore e che la velocità IO del disco era molto inferiore alla sua capacità. Pertanto, è possibile migliorare facilmente le prestazioni suddividendo l'input in quattro parti e assegnando ciascuna a uno script separato.

L'approccio più semplice che riesco a pensare è quello di dividere l'input in tante parti quante il numero di core (ovviamente, non voglio che l'utente si preoccupi del numero di core) usando alcune variazioni del split comando e apporta modifiche allo script in modo che possa chiamarsi passando una parte dell'input.

Quali sono alcune idee a riguardo?

    
posta pdp 01.05.2016 - 18:04
fonte

2 risposte

1

Una bella funzione di Bash è che una funzione può essere chiamata in un processo separato. Ad esempio, se esiste una funzione:

process_one_file() {
...

Può essere chiamato in un processo separato (notare la e commerciale alla fine):

process_one_file file_1 &

Ho riscritto lo script per elaborare i file 1-4 (come input dell'utente) in parallelo. La sceneggiatura principale avrebbe aspettato che tutti i bambini finissero. Quando tutti i bambini vengono terminati, avvia nuovamente lo stesso numero di processi paralleli fino a quando non ci sono file da elaborare. Questo design ha comportato una riduzione del 50% del tempo di esecuzione sul mio sistema basato su CPU Intel i5 a 4 core.

    
risposta data 29.12.2016 - 14:54
fonte
0

Se riesci a ristrutturare l'elaborazione in più passaggi discreti con pipe che li collegano ( grep | sed | awk ), eseguirai ciascun comando in un processo separato, dandoti un certo parallelismo praticamente gratis.

Un'altra opzione è GNU Parallel. Funziona vagamente come xargs ma ti dà l'esecuzione parallela degli argomenti. Praticamente 'magicamente' prenderà una lista di file di input e amp; licenziare un processo per gestirli singolarmente, avviando i nuovi processi in base alle esigenze.

Entrambi sono modi abbastanza banali per ottenere un parallelismo. La prima opzione è migliore se hai un singolo grande input, il secondo sarebbe meglio se hai un sacco di input diversi.

    
risposta data 30.12.2016 - 01:46
fonte

Leggi altre domande sui tag