Implicazioni sulla complessità del tempo durante la progettazione di script di shell per grandi quantità di dati / numero elevato di file?

0

Ci sono molti domande sull'esecuzione di comandi o script sulla risorsa U + L SE. Dato che il tempo è essenziale, questo viene spesso valutato usando il bash di tempo parola riservata o il comando esterno time e un sottoinsieme dei dati di destinazione, in media o senza carico.

Tuttavia ci sono scenari che riguardano un numero elevato di file o semplicemente operazioni su file molto grandi. In alcuni casi un attento esame di ciò che accade nella shell, una conoscenza complessa del comportamento dei comandi, anche considerazioni sull'hardware, forniscono informazioni sull'efficienza. Ma il benchmarking non è una questione semplice.

In un caso recentemente un membro della comunità ha fatto un commento sulla complessità temporale di un comando, sottintendendo che non esisteva alcuna operazione di ordinamento - e non semplicemente nessun comando sort - alla fine sarebbe migliorato con più dati. La soluzione riguardava awk , mentre un'altra soluzione comportava ad esempio una combinazione dei comandi grep , sort e head .

  • Questa è solo un'istanza di "il più semplice è il migliore" - quali sono le principali implicazioni della complessità temporale durante la progettazione di script di shell che operano su enormi set di dati (numero o dimensione)?
  • Al di là del buon senso e smistamento (un'operazione per cui esiste un livello apparentemente elevato di intuizione sui costi delle prestazioni, anche per un non esperto), esiste una ben nota complessità temporale comune esempio che mostra come i concetti si applicano in pratica allo script di shell?
posta のbるしtyぱんky 25.05.2014 - 10:35
fonte

1 risposta

1

Per prima cosa devi capire qual è la complessità temporale di un programma che ti sta dicendo. La complessità temporale è una misura del modo in cui il tempo di esecuzione di un programma cambia al variare delle dimensioni dei dati di input. Se n è la dimensione dei dati di input, quindi dicendo che il programma A è O (n) e il programma B è O (n * log n) significa che il tempo di esecuzione del programma A è sempre minore di C * n, e il funzionamento il tempo del programma B è sempre inferiore a K * n * log n. C e K sono alcune costanti, che di solito non conosciamo.

Se grafici (C * n) e (K * n * log n) contro n, ci sarà un punto in cui la linea per (K * n * log n) passerà sopra la linea (C * n ). Ciò significa che per tutti i set di dati più grandi di quel punto, il programma A calcolerà la risposta più velocemente del programma B. Poiché in genere non sappiamo quali siano le costanti C e K, non sappiamo quale sia questa soglia, semplicemente sappi che esiste.

La complessità del tempo viene calcolata per gli script della shell nello stesso modo in cui lo è per qualsiasi lingua. L'unica differenza è che alcune delle affermazioni sono più opache e potrebbe essere necessario ricercarne l'implementazione o fare supposizioni sul fatto che vengano implementate "ragionevolmente". Lo script awk nell'esempio a cui ti sei collegato è solo un ciclo "for" che tocca ogni elemento dei dati di input esattamente una volta. Ciò significa che ha quasi certamente una complessità temporale di O (n).

Dico quasi certamente, perché è teoricamente possibile che awk stia facendo qualcosa di bizzarro internamente che cambierebbe la complessità temporale della sceneggiatura. Se avevi bisogno di una garanzia, puoi guardare il codice sorgente di awk e ottenere una risposta definitiva. Tuttavia, awk è in giro da quarant'anni e ha lavorato su molti programmatori competenti, quindi è un presupposto abbastanza ragionevole che un ciclo awk per il ciclo che tocca n elementi abbia una complessità temporale di O (n).

D'altra parte, è un risultato ben noto dall'analisi degli algoritmi che nessuna routine di ordinamento può avere una complessità temporale migliore di O (n * log n). Ciò significa che il comando sort può essere trattato come una scatola nera, ma possiamo essere sicuri che la sua complessità temporale sia peggiore di O (n log n). Ciò significa che se i dati di input diventano abbastanza grandi, ci sarà un certo punto in cui lo script awk sorpassa lo script sort e head.

Tutta la discussione di cui sopra è davvero rilevante solo se il tuo script ha bisogno di gestire set di dati di dimensioni arbitrarie. Gli script di shell sono spesso scritti per eseguire 'una volta solo' le faccende su piccoli set di dati. In questi casi potrebbe non valere la pena di pensare a un'analisi del tempo di esecuzione. A chi importa se lo script awk risolve il problema 2 secondi più velocemente dello script di tipo e testa se devi investire 45 minuti nell'apprendimento di awk? *

* Se il tuo lavoro richiede di risolvere problemi come questo sempre, allora sì, ovviamente dovresti imparare awk e probabilmente tre o quattro altri linguaggi di scripting. Tuttavia, si tratta di ottimizzare la tua carriera, quindi di risolvere opportunamente il problema.

    
risposta data 25.05.2014 - 20:48
fonte

Leggi altre domande sui tag