Tomasz Kępski

Tomasz Kępski Project Manager,
Programista PHP,
Perl

Temat: Kolejka FIFO w pamięci

Hej,

mam skrypt przetwarzający duże ilości danych które schodzą w postaci XML'a. Korzystam m.in. z File::Queue do utworzenia kolejki FIFO. Do niej pisze główny skrypt odczytujący kolejne porcje danych z XML'a, a skrypty klienckie odbierają te dane do dalszej obróbki.

Chciałbym poprawić wydajność całego rozwiązania. Wąskim gardłem okazuje się być dysk. Co mnie zresztą nie dziwi. Tak sobie zamarzyłem, by z kolejką FIFO uciec do pamięci dzięki temu odpadł by mi nadmiarowy zapis/odczyt.

Czy ktoś z Was robił coś w ten deseń i mógłby naprowadzić?
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: Kolejka FIFO w pamięci

Ja mam takiego malutkiego śmiesznego deamona na lapku, który kolejkuje dla mnie komunikaty, który mają być odtwarzane przez syntezator mowy. Oto kod (może pomoże):
#!/usr/bin/perl -w
package Festival_queue;

use strict;
use warnings;
use base qw(Net::Server::Multiplex);
use Net::Server::Daemonize qw(daemonize);
use threads;
use threads::shared;

my @que :shared;
my $exit:shared = 0;
my $thr;

daemonize('daemon','audio',undef);

my $server = bless {server=>{port => 1315, cidr_allow => '127.0.0.0/8'}}, 'Festival_queue';
$server->run();

sub pre_loop_hook {
$thr = threads->create('fplayer');
}

sub pre_server_close_hook {
$exit = 1;
$thr->join();
}

sub fplayer {
while (1) {
return if ($exit == 1);
if ($#que < 0) {
sleep 1;
} else {
open(PLAY, "| /usr/bin/festival_client --ttw | AUDIODRIVER=oss /usr/bin/play -t wav - -q");
print PLAY shift(@que);
close(PLAY);
}
}
}

sub mux_input {
my $self = shift;
my $mux = shift;
my $fh = shift;
my $input = shift;

push(@que, $$input);
close($fh);
close(STDOUT);

return 0;
}

Następna dyskusja:

perl - duże zużycie pamięci




Wyślij zaproszenie do