PodCleaner multithreaded?

È da un po’ di tempo che non vi aggiorno solo stato della mia prossima applicazione: PodCleaner.

Ho passato l’ultimo mese a lavorare sulle performance dell’applicazione, non tanto perché volessi migliorare la velocità di elaborazione quanto perché avevo dei grossi limiti imposti dall’ambiente di sviluppo che sto usando.

 

Meta-byte array

Lavorare con i file audio significa avere a che fare con dei file che sono grandi, più o meno, 300 MB per ogni ora di registrazione.

podcleaner_multithreaded.001

Alcuni podcast possono essere lunghi fino a due ore, anche due ore mezza, e se i partecipanti sono diversi allora possiamo ben vedere che una singola puntata di una trasmissione può arrivare ad occupare anche 3 GB!

E stiamo parlando di dati grezzi.

Per qualche motivo a me ignoto, il framework che stavo utilizzando per la gestione di questa grande mole di dati era tale per cui, dopo un po’, file di dimensioni troppo lunghe generavano errori di esecuzione.

Errori di esecuzione non predicibili, per cui difficilmente aggirabili.

Il primo passo è stato quello di realizzare un nuovo framework che consentisse di dividere in file più piccoli le registrazioni più lunghe.

Nella fattispecie la dimensione più piccola adesso è di 50 MB, con una serie non limitata di concatenazioni.

podcleaner_multithreaded.003

50 MB corrispondono, più o meno, a 9-10 minuti di registrazione.

Ma anche questo non ha dato dei risultati ottimali, perché su registrazioni molto lunghe, l’intero framework, anche quando ogni singolo file avviene spezzettato, arriva ad un limite oltre il quale non riesce più ad andare, una sorta di “overflow” che non si può contenere, per cui puntate registrate da più persone e di una certa lunghezza (per esempio 3 persone per 90 minuti) generavano errori.

 

Esecuzione parallela

JKW2F_H09XMP

Unica soluzione a cui sono riuscito a pensare, quest’estate sotto l’ombrellone (anche se non è che ci fosse molto sole) è stata quella di realizzare diverse istanze del programma, ognuna delle quali si concentrasse su un singolo file, per cui puntate molto lunghe, quelle di cui, come vi ho detto prima, sui 3 GB, potevano venire suddivise spezzoni più semplice da 600-750 MB.

podcleaner_multithreaded.004

Ma mi sono spinto oltre, per cui adesso ogni singola operazione viene realizzata da un’applicazione esterna: l’analisi dei cluster, la riduzione del rumore, l’adeguamento della potenza (con il compressore), questo consente di mantenere ai minimi i dati elaborati e, grande vantaggio, di poter parallelizzare tutto quanto.

podcleaner_multithreaded.005

Al momento dell’installazione, l’applicazione PodCleaner crea 10 copie di se stessa in una sottocartella.

podcleaner_multithreaded.006

Quando l’applicazione deve effettuare un’elaborazione, scrive il compito in un file, chiamato TASK e poi lancia una delle copie clone, la copia clone è nominata con un numero che vada uno a 10 e, dunque, va a leggersi il task relativo.

podcleaner_multithreaded.007

E successivamente lo esegue, salvando continuamente la percentuale di lavoro effettuato in un altro file.
L’applicazione principale continua a leggere il file della percentuale e lo mostra a schermo.

podcleaner_multithreaded.008

Quando infine il lavoro viene completato il file con il risultato viene riempito con un “100%” e l’applicazione clone si auto chiude.

L’applicazione principale, a questo punto, prende i risultati della figlia e continua con l’elaborazione.

Questo consente di parallelizzare tutti i lavori che non sono dipendenti dal risultato di un altro compito.

Tutte le operazioni sul singolo file vengono eseguite da una di queste applicazioni clone, per cui se stiamo elaborando 3 file in contemporanea, saranno sempre presenti 3 applicazioni figlie che effettuano le lavorazione.

podcleaner_multithreaded.009

Dato che è comunque presente anche l’applicazione principale, se stiamo lavorando con N file allora le applicazioni in esecuzione saranno sempre N + 1.

Se il nostro computer è dotato di 4 core, allora il risultato ottimale si ha con l’elaborazione simultanea di 3 file (3 file più l’applicazione principale).

podcleaner_multithreaded.010

 

Audio sync

La versione attuale di PodCleaner effettua tutte le elaborazioni sui file in parallelo, e poi tutti i rami vengono riuniti al momento dell’elaborazione sulla sincronizzazione.

podcleaner_multithreaded.011

Stiamo già lavorando ad una nuova versione di PodCleaner che effettua le operazioni di sincronizzazione subito dopo l’analisi dei cluster dei singoli file, arrivando ad ottenere un altro processo in parallelo, risparmiando di conseguenza molto tempo, se per esempio stiamo sincronizzando 4 file, operazione che può prendere anche 10-15 minuti su un computer relativamente veloce.

Adesso l’analisi della sincronizzazione avviene con un singolo processo, ma non è escluso che si possa costruire un piccolo framework per l’elaborazione parallela anche di questo, cosa che sarà decisamente necessaria nel caso i file a da sincronizzare arrivino a 5, dato che si tratta di un processo di computazione esponenziale.

podcleaner_multithreaded.012

Teoricamente parlando l’elaborazione e il calcolo della sincronizzazione potrebbero avvenire anche su più computer contemporaneamente, dato che, una volta che sono stati identificati di cluster (e si tratta di circa 50-100 kB di dati per ogni file), questi dati potrebbero venire calcolati in maniera “brute force” su diversi computer…

podcleaner_multithreaded.013

 

…o, anche e soprattutto nel cloud!

podcleaner_multithreaded.014

Ad ora l’unica macchina che potrei mettere a disposizione con diversi core dedicati all’elaborazione parallela è una vecchio server con otto core, sufficientemente buono e performante per ridurre i tempi di elaborazione, ma si tratta comunque di un’idea ancora molto lontana nel tempo e comunque non certo una delle mie priorità.

Ad oggi, comunque, postlineare è stato testato con grande successo nella sincronizzazione di 3 file, mentre sono piuttosto in difficoltà a reperire registrazioni realizzate da 4 persone, ne ho tantissime con 5 ma quasi nessuna con 4.

Per cui non posso dire di essere ancora sicuro sull’effettivo funzionamento dell’algoritmo.

Vi terrò comunque (più o meno) costantemente aggiornati sulle evoluzioni di PodCleaner e, naturalmente, su quando l’applicazione verrà rilasciata.

State tonnati!

Annunci

2 pensieri su “PodCleaner multithreaded?”

  1. Mmmmmmm… Molto imteressante!
    Mi ricorda vagamente il progetto BOINC.
    In casi come questo il calcolo distribuito puó essere l’unica soluzione, o comunque la più economica.

    1. La vedo dura che si possa fare qualcosa del genere, e poi su file grandi non è nemmeno necessario, sto ottimizzando le risorse e sta funzionando alla grande! 😀

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...