fork in Perl

09/03/2008 - 00:18 von CK | Report spam
Hallo allerseits,

ich habe mit einem interessanten Phànomen zu kàmpfen:

Eine Anzahl an XML Files wird einem Perl Prozess in einer Liste
übergeben und diese Files werden dann abgearbeitet (Parsen, umarbeiten
mittels XML::Twig, Konsistenzchecks usw.). Die alte Version arbeitet
natürlich sequentiell, das funktioniert zwar, ist aber nicht unbedingt
schnell.

Auf der Suche nach Optimierungsmöglichkeiten gab es folgende Idee: Die
Files könnten doch per fork() abgearbeitet werden, schliesslich sind
sie ja voneinander unabhàngig und wichtig ist eigentlich nur, dass
eben erst das "okay" gegeben wird, wenn alle fertig sind.

Das ist natürlich schneller als vorher, allerdings scheint es leider
nicht so stabil zu sein, der Prozess kommt nàmlich manchmal nicht zum
Ende. Es gibt irgendwie keinen eindeutigen Fehler, lediglich ab einer
Grössenordnung von drei Listen á ca. 20 Files scheint es nicht mehr zu
wollen. Das Ganze làuft unter Solaris 10. Das verwendete Perl ist ein
5.8.4 (oder 5.8.2): ein Upgrade ist im Augenblick nicht möglich.

Was kann man tun?
Claus Dragon <clauskick@mpsahotmail.com>
=(UDIC)d++ e++ T--
K1!2!3!456!7!S a29
"Coffee is a mocker. So, I am going to mock."

- Me, lately.
 

Lesen sie die antworten

#1 Florian Weimer
09/03/2008 - 09:45 | Warnen spam
* CK:

Das ist natürlich schneller als vorher, allerdings scheint es leider
nicht so stabil zu sein, der Prozess kommt nàmlich manchmal nicht zum
Ende. Es gibt irgendwie keinen eindeutigen Fehler, lediglich ab einer
Grössenordnung von drei Listen á ca. 20 Files scheint es nicht mehr zu
wollen. Das Ganze làuft unter Solaris 10. Das verwendete Perl ist ein
5.8.4 (oder 5.8.2): ein Upgrade ist im Augenblick nicht möglich.

Was kann man tun?



xargs -P verwenden (ggf. braucht das ein GNU-Userland), falls nicht der
Startup-Overhead für das Perl dominiert. Wenn es nicht xargs sein soll,
kannst Du auch mehrfach ein Pipe-open auf das Perl-Skript selbst machen,
das macht direkt nach dem fork ein execve, was deutlich sauberer ist.
Aber auch das hilft nur, wenn nicht der Overhead durch die
Perl-Bibliotheken zu groß ist.

Es gibt auch noch Parallel::Queue und Perl-Threads.

Ähnliche fragen