Processamento Paralelo em Shell Script - Conversão de Arquivos WAV para MP3

Este artigo tem a finalidade de auxiliar na melhor utilização dos recursos físicos do seu servidor/computador. Vamos utilizar o |P|P|S|S| - (Distributed) Parallel Processing Shell Script para otimizar a conversão de arquivos de gravação do Asterisk de WAV para MP3.

[ Hits: 13.620 ]

Por: Eduardo Rebelo Lopes em 10/01/2013


Convertendo arquivos de áudio em paralelo



Muitas vezes nosso PABX realiza milhões de gravações diárias, então colocamos aquele script bacana na Cron para toda noite ficar lá se matando em converter arquivo por arquivo. Aqui vamos melhorar um pouco este processo, otimizando sua performance.

Eu criei um script bastante simplista para demostrar o funcionamento do PPSS, segue abaixo.

#!/bin/bash
#Script criado por Eduardo Lopes - 03/01/2013

#Diretório de origem e destino

SRC=$1
DST=$2

#Conversão em multi-thread ou não -> 0 - sim / 1 - não
CORE=$3

if [ $# -ne 3 ]
then
  echo "=============================================
  echo "Número de argumentos inválido"
  echo "Você deve executar esse script da seguinte forma:"
  echo "./wav2mp3 <DIRETORIO ORIGEM> <DIRETORIO DESTINO> <MULTI-THREAD (0-SIM/1-NÃO)> "
  echo "=============================================
else
  if [ $CORE -eq 0 ]
  then
    ./ppss -d $SRC -c 'BASENAME=`basename "$ITEM" .wav`; lame --quiet --preset insane "$ITEM" "$OUTPUT_DIR/$BASENAME.mp3"' -o $DST
  elif [ $CORE -eq 1 ]
  then
    ./ppss -d $SRC -c 'BASENAME=`basename "$ITEM" .wav`; lame --quiet --preset insane "$ITEM" "$OUTPUT_DIR/$BASENAME.mp3"' -o $DST -p 1
  else
    echo "Valor para Multi-Thread deve ser: (0 - SIM ou 1 - NÃO)"
  fi
fi

Obs.: O script utiliza o LAME para conversão, caso não o tenha instalado, pode ser adquirido pelo link:
Com esse script, podemos escolher o diretório de conversão (origem e destino) e ainda, se quisermos, utilizar de forma multithread ou não. Somente criei dessa forma para comparar as execuções (tempo de processamento) entre as formas de processamento (multithread ou não). Irei utilizar 1 GB de gravação (aproximadamente 613 arquivos em WAV) em uma máquina Core i5 com 4GB de RAM e Ubuntu 10.04.4.

Pode-se observar na documentação do PPSS que ele nos permite escolher diversos parâmetros, quantidade de núcleos etc. Eu estou utilizando ou 1 ou todos, nesse caso, os 4 disponíveis.

Abaixo o print da conversão em multithread, pode-se observar que o PPSS nos mostra até mesmo quantos arquivos deram falha ao converter.
O próprio PPSS gera uma diretório com diversos arquivos de log, com o nome de "ppss_dir" e dentro desse diretório, iremos encontrar:

# ls
INPUT_FILE-27823
job_log
LIST_OF_FAILED_ITEMS
LIST_OF_PROCESSED_ITEMS
NODE_STATUS
PPSS_ITEM_LOCK_DIR
PPSS_LOCAL_OUTPUT
PPSS_LOCAL_TMPDIR
ppss-log-27823.txt

E dentro de cada diretório/arquivo, temos os dados de quais arquivos deram falha, sucesso etc. Basta uma rápida visualizada e já verificamos a causa do erro no arquivo não convertido.

Podemos ainda verificar, na imagem acima, que a conversão desse 1 GB de arquivo demorou 1:42 min. Abaixo, temos a conversão com o PPSS, porém, agora sem utilizar o método de multithread, ou seja, arquivo por arquivo:
Podemos observar que tivemos também uma falha, da mesma forma que no método multithread (utilizei os mesmos arquivos WAV), porém, agora o tempo foi de 4:54 min, ou seja, mais de 3X o tempo. É obvio que o tempo de processamento será proporcional ao número de núcleos disponível, sendo assim, quanto mais, melhor.

Cabe lembrar que, quando utilizamos o processamento distribuído, a máquina não irá realizar as demais tarefas de forma performática, ou seja, poderá faltar recursos caso alguma tarefa "pesada" seja executada. É sempre bom avaliar quais processos devem ser executados em paralelo, o importante é aproveitar os recursos que dispomos!


É isso aí!
Viva o Linux.

Página anterior    

Páginas do artigo
   1. Introdução - PPSS
   2. Convertendo arquivos de áudio em paralelo
Outros artigos deste autor

Zabbix + SMS = GoogleCL (Google Command Line)

Leitura recomendada

Como programar backup com rsync e cron de maneira rápida e simples

Redundância de link de internet

GNU Parallel: criando atividades em paralelo com shell script

Enviando mensagens de WhatsApp no Linux usando Shell Script e ADB

Piano Gripe 3 - Caracteres de controle

  
Comentários
[1] Comentário enviado por drc em 10/01/2013 - 10:26h

Parabéns pelo artigo, ficou muito bem escrito.
vou fazer um teste no meu servidor de homologação rodando progress. a rotina de backup on-line é muito dispendiosa para meu server.

[2] Comentário enviado por julio_hoffimann em 12/01/2013 - 11:55h

Ótimo artigo Eduardo, parabéns!

Abs.

[3] Comentário enviado por albfneto em 13/01/2013 - 15:05h

Muito bom esse script, sabe se pode ser usado para conversão de vídeo, computação distribuida (tipo BOINC) etc... e como se
faz?
não sou profissional de TI.

[4] Comentário enviado por edul0pes em 14/01/2013 - 08:22h

Obrigado!

Alberto, você pode utilizar sim para conversão de vídeo, mais a implantação depende muito da sua topologia, a ideia de computação distribuída é um pouco diferente de processamento em paralelo, o PPSS visa a distribuição e controle do processamento em paralelo, como se você fizesse a mesma coisa em todos os núcleos do processador ao mesmo tempo e não tarefas diferentes por núcleo.

Entende?

Abs

[5] Comentário enviado por phoemur em 22/07/2013 - 23:22h

Costumo usar para isso multithreading com xargs e funciona bem...

por exemplo:

find . -iname *.wav -print0 | xargs -0 -i -P0 lame --quiet --preset insane {} {}.mp3

A opção -P do xargs indica quantos processos simultâneos você quer rodar... se utilizar -P0 como no exemplo você deixa o gerenciamento de processamento por conta do xargs e ele vai executar o máximo possível de processos simultâneos...

[6] Comentário enviado por edul0pes em 23/07/2013 - 09:05h

Fala phoemur,

O xargs também é uma alternativa com certeza, o legal do ppss é a geração automática dos logs, assim, eu faço o monitoramento desses arquivos com o Zabbix e caso ocorra qualquer problema em uma conversão eu disparo uma trigger e posso tomar as ações necessárias. Caso o cenário não tenha essa necessidade o xargs resolve muito bem a tarefa. Valeu pela dica.

Abs

[7] Comentário enviado por edul0pes em 23/07/2013 - 09:06h






Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts