<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Blog of a WebDeveloper &#187; Bash Scripting</title>
	<atom:link href="http://joaopedropereira.com/blog/category/bash-scripting/feed/" rel="self" type="application/rss+xml" />
	<link>http://joaopedropereira.com/blog</link>
	<description>Um novo estilo de desenvolvimento</description>
	<lastBuildDate>Wed, 27 Jul 2011 21:19:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Processamento Paralelo com xargs</title>
		<link>http://joaopedropereira.com/blog/2010/02/22/processamento-paralelo-xargs/</link>
		<comments>http://joaopedropereira.com/blog/2010/02/22/processamento-paralelo-xargs/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 22:54:35 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[Bash Scripting]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[cp]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[man]]></category>
		<category><![CDATA[nmap]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[processamento]]></category>
		<category><![CDATA[rm]]></category>
		<category><![CDATA[xargs]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=695</guid>
		<description><![CDATA[Com processadores multi-core semi-parados na maior parte das nossas tarefas e com a necessidade de processar grandes quantidades de informação / ficheiros é importante aproveitar toda a potencialidade de todos os núcleos. Nos sistemas Unix (neste caso testei num sistema Linux com a distro Ubuntu) é possível separar uma tarefa em vários processos de forma [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F02%2F22%2Fprocessamento-paralelo-xargs%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F02%2F22%2Fprocessamento-paralelo-xargs%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Com processadores multi-core semi-parados na maior parte das nossas tarefas e com a necessidade de processar grandes quantidades de informação / ficheiros é importante aproveitar toda a potencialidade de todos os núcleos.</p>
<p>Nos sistemas Unix (neste caso testei num sistema Linux com a distro Ubuntu) é possível separar uma tarefa em vários processos de forma a que a tarefa seja distribuida por mais que um núcleo do processador (no caso dos processadores multi-core) e por vários processos (jobs) que podem ser executados em simultâneo não dependendo que o primeiro acabe para executar o segundo podendo ter vários a correr ao mesmo tempo aumentando assim a performance da acção.</p>
<p>Este comando suporta a opção -P com a qual podemos especificar a quantidade de processos (jobs) a correr em paralelo.</p>
<pre>$ man xargs
(...)
<strong> --max-procs=max-procs
-P max-procs</strong>
Run  up  to max-procs processes at a time; the default is 1.
If max-procs is 0, xargs will run as many processes as possible  at a  time.
Use the -n option with -P; otherwise chances are that only one exec will be done.
(...)</pre>
<h2>Exemplo de Utilização</h2>
<pre>$ ls . | xargs -P 0 -i -t cp -R {} ../novo/</pre>
<h3>Decompondo o Exemplo</h3>
<p><strong>Listagem dos ficheiros da pasta</strong></p>
<pre>$ ls .</pre>
<p><strong>Xargs</strong></p>
<pre>xargs -P 0 -i -t</pre>
<p>&#8220;-P 0&#8243; utiliza o número máximo de processos<br />
&#8220;-t&#8221; verbose mode activo</p>
<p><strong>Cópia</strong></p>
<pre>cp -R {} ../novo/</pre>
<p>&#8220;-R&#8221; copia de forma recursiva as pastas existentes<br />
&#8220;{}&#8221; existe devido ao parâmetro &#8220;-i&#8221; do comando xargs utilizado, que corresponde a cada ficheiro/pasta que queremos copiar<br />
&#8220;../novo&#8221; pasta de destino</p>
<h2>Mais exemplos</h2>
<p>Apagar todos os ficheiros com a extensão pdf</p>
<pre>find ./ -name "*.pdf" | xargs -t -Istr rm str</pre>
<p>Converter ficheiros pdf (.pdf) para ficheiros de texto simples (.txt)</p>
<pre>find ./ -name "*.pdf" | xargs -Istr pdftotext str</pre>
<p>Nestes exemplos podem acrescentar sempre a opção &#8220;-P x&#8221; em que x é o valor de processos que querem a correr em paralelo, em algumas situações permite-nos aumentar a performance do processamento através da resolução de tarefas em paralelo como veremos a seguir.</p>
<h2>Testes de Performance</h2>
<pre>:~/teste$ ls
teste1  teste2
~/teste$ ls teste1/ | wc
33      58    1036
~/teste$ ls teste2/ | wc
33      58    1036

~/teste$ time find ./teste1/ -name "*.pdf" | xargs -Istr pdftotext str
real	1m9.805s
user	0m44.795s
sys	0m6.564s

~/teste$ time find ./teste2/ -name "*.pdf" | xargs -P 6 -Istr pdftotext str
real	0m39.911s
user	0m44.523s
sys	0m6.304s</pre>
<p>Utilizando exactamente os mesmos ficheiros vemos alguma diferença a executar a mesma operação com e sem processamento distribuído da tarefa, que é realizada por diversos processos executados em paralelo.</p>
<pre>~/teste$ time find ./teste1/ -name "*.pdf" | xargs -Istr rm str
real	0m0.296s
user	0m0.060s
sys	0m0.088s

~/teste$ time find ./teste2/ -name "*.pdf" | xargs -P 6 -Istr rm str
real	0m0.163s
user	0m0.060s
sys	0m0.084s</pre>
<p>Novamente podemos verificar um aumento na performance das acções com o processamento em paralelo.</p>
<h2>Outras utilizações</h2>
<p>Além destas tarefas que foram mostradas em cima digamos, do dia-a-dia de qualquer utilizador de um sistema Unix que tenha descoberto as maravilhas da consola, podem ser destacadas utilizações mais direccionadas a áreas de trabalho:</p>
<ul>
<li>utilização do xargs em conjunto com o ping para detectar vários hosts simultaneamente diminuindo o tempo de espera para grandes pesquisas</li>
<li>utilização do xargs em conjunto com o nmap. O nmap nos scans não utiliza muita bandwidth para não ser detectado e então podemos fazer scan a mais que um host em simultâneo aproveitando as capacidades da ligação e da máquina</li>
<li>conversão de discografias completas ou de albuns inteiros de fotos</li>
</ul>
<p>Mais ideias diferentes?</p>
<h2>Man Pages</h2>
<p><a title="Man cp" href="http://unixhelp.ed.ac.uk/CGI/man-cgi?cp" target="_blank">$ man cp</a><br />
<a title="Man rm" href="http://unixhelp.ed.ac.uk/CGI/man-cgi?rm" target="_blank">$ man rm</a><br />
<a title="Man xargs" href="http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs" target="_blank">$ man xargs</a><br />
<a title="Man ls" href="http://unixhelp.ed.ac.uk/CGI/man-cgi?ls" target="_blank">$ man ls</a><br />
<a title="Man find" href="http://unixhelp.ed.ac.uk/CGI/man-cgi?find" target="_blank">$ man find</a></p>
<div class="shr-publisher-695"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F02%2F22%2Fprocessamento-paralelo-xargs%2F' data-shr_title='Processamento+Paralelo+com+xargs'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F02%2F22%2Fprocessamento-paralelo-xargs%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F02%2F22%2Fprocessamento-paralelo-xargs%2F' data-shr_title='Processamento+Paralelo+com+xargs'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/02/22/processamento-paralelo-xargs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

