Za jídlo, šaty a vzduch otročíme na programech z temných světů

(dc)RAW, Perl a zkracování nekonečna

Jak jsem naznačil v předchozím článku, focení do RAWu umí být časově dosti opruzná záležitost. Když je fotek více, všechny jsou v RAWu a všechny je máte projít a zpracovat, může se to velmi rychle začít jevit jako opruz takřka nekonečný.

Například v sobotu jsem byl celý den v terénu. Vstal jsem v Praze v šest ráno, v půl jedenácté jsem stál na vrcholu Jizery, vyvolával do vysílačky a během toho občas zmáčkl spoušť. Ve dvě jsem už zase seděl v autě a mířil k Ještědu, kde jsem stejnou činnost vykonával od čtyř do deseti večer. Pár fotek jsem nacvakal i cestou v železničním depu Tanvald, kde mají tak krásné věci, že minout ho dva roky po sobě, musel bych si nafackovat. Druhý den jsem hodil kartu do čtečky (FireWire kabel jsem stále ještě nenašel) a zjistil, že mám 82 fotek.

Když přepnu PowerMac na plný výkon, je otevření jednoho X3F souboru v Sigma Photo Pro záležitostí zhruba patnácti sekund. Stejný časový úsek zabere přiblížení či oddálení fotky, pohyb mezi obrázky tam a zpět a celkově je tak už prvotní probrání fotek činnost na několik hodin. Jistě, jedním z možných řešení je například koupě novějšího a výkonnějšího počítače, ale jak jistě tušíte z čistě principiálních důvodů mám tuto variantu až zcela na konci seznamu variant. K focení ostatně stačí trocha asfaltu na cínové tabulce, 2x2GHz v 64bitovém provedení by tedy mělo stačit také.

Pokusil jsem se proto urychlit alespoň ono prvotní probrání vyfocených snímků. Abych zjistil, že mi těsně za vyfocenou lokomotivou T426.00x projíždělo auto zrovna ve chvíli, kdy jsem mačkal spoušť, nemusím nechávat procesor na fotku aplikovat všechny ty vylepšující algoritmy, které na ní Sigma Photo Pro sesílá. S takovou fotkou se beztak nebudu znát dlouho a je to jen zbytečné šoupání křemíku. Zda má či nemá smysl se fotkou dále zabývat, lze posoudit i z nijak neupraveného TIFFu, který může v intervalu deseti sekund padat z dcraw. Sice nebude vypadat ani trochu jako výsledná fotka, ale čtyři přebývající gumová kola na lokomotivě nebo naopak chybějící hlavu u postavy, která ji prokazatelně v době focení měla, na takovém obrázku jistě odhalím.

Utilita dcraw je striktně jednovláknová. To má výhodu v tom, že když zpracováváte dávkově fotky a chcete během toho dělat i něco dalšího, jsou vám u víceprocesorového systému k dispozici všechna jádra kromě jednoho. Nevýhodou je, že pokud chcete počítač plně zaměstnat jen konverzemi a podstatně tak zkrátit dobu zpracování, bez trochy psaní se už neobejdete. Já mám rád Perl, tak jsem si v něm vytvořil krátký skript, který jsem nazval forker.pl. Spouští se vždy v adresáři s X3F soubory a jediným jeho parametrem je počet aktivních procesů které má při konverzi udržovat.


#!/usr/bin/perl
use strict;
use warnings;

my $fc = $ARGV[0];
my $cmd = "dcraw -T ";
my @files = <*x3f>;

for (my $i=0;$i<$fc;$i++) {
	&doFork;
}
my $id = 0;
do {
	$id = wait();
	&doFork;
} while ($id != -1);
print "Done.\n";

sub doFork {
	if (my $file=pop(@files)) {
		my $pid = fork();
		if ($pid == -1) {
			die;
		} elsif ($pid == 0) {
			print "Processing: $file\n";
			exec "$cmd$file" or die;
		}
	}
}

Řekl bych, že kód je dostatečně samovysvětlující, přesto alespoň stručné shrnutí: Seznam X3F souborů aktuálního adresáře je v poli @files, ke kterému se přistupuje jako k zásobníku a jednotlivé soubory se z něj odebírají pomocí pop(). Na počátku nastartuje tolik samostatných procesů konverze, kolik je uživatelem zadáno pomocí parametru a následně se vždy ukončený proces ihned nahradí procesem novým. Děje se tak dokud je co z pole @files odebírat. Samotné vytváření procesů má na starosti subrutina doFork() definovaná v závěru skriptu, která je v podstatě učebnicovým příkladem použití perlovské funkce fork().

Dvaaosmdesát fotek se zpracovávalo 5m 44s, což je v průměru něco přes čtyři sekundy na fotku. Otevření TIFFu je prakticky okamžité, jeho smazání taktéž, takže probrání fotek možná ani těch pět minut nezabralo. Následně jsem pustil druhý skript, který z adresáře smazal všechny X3F, ke kterým neexistoval TIFF. Jeho zdroják je tak triviální, že nemá ani smysl jej zde vypisovat. Zbývajících 26 fotek jsem pak už skutečně musel otevřít v Sigma Photo Pro, jejich ruční "vyvolání" bylo otázkou necelé půlhodinky.

Doba zpracování většího množství fotek se tak pro mě podstatně zkrátila, nákup nového hardware se odkládá na neurčito a ještě jsem si při tom zkusil něco nového v Perlu. Co víc dodat?

Snad jen tu zmiňovanou lokomotivu T426.xx v depu Tanvald.

T426.00x in Tanvald depot