Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Perl] Многопотоковая обработка файлов / 14 сообщений из 14, страница 1 из 1
31.05.2013, 22:11
    #38282107
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Всем привет!

Требуется написать скрипт, который в архивированных gzipom csv файлах делает замену текста regex-ом. Обработка файлов должна проводиться в параллельном режиме. В одном gzip файле - один csv файл.

Плиз поделитесь кодом или примером как это можно сделать. Я больше программирую на c#, а код нужен именно на perl под юникс.
...
Рейтинг: 0 / 0
05.06.2013, 23:02
    #38287570
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
man fork
man perltut
man perlfunc
...
Рейтинг: 0 / 0
06.06.2013, 12:20
    #38288135
mhx
mhx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Ну вот несколько примеров:
1. threads + Thread::Semaphore

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
#!/usr/bin/perl

use strict;
use warnings;
use threads;
use Thread::Semaphore;

my @files = `ls *.bz2`;
chomp @files;
print "Number of files: ", scalar @files, "\n";

my $count = shift || 20;
print "Number of threads: $count\n";

my @threads;
my $sem = Thread::Semaphore->new ($count);
for (@files)
{
    # request a thread slot, waiting if none are available:
    $sem->down;
    push @threads, async { read_file ($_); };
}
$_->join for @threads;

print "Complete\n";
1;

sub read_file
{
    my $file = shift;
    # что-то сделать с файлом
    ...
    # release slot:
    $sem->up;
}


2. threads + Thread::Queue

Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
#!/usr/bin/perl

use strict;
use warnings;
use threads;
use Thread::Queue;

my @files = `ls *.bz2`;
chomp @files;
print "Number of files: ", scalar @files, "\n";

my $count = shift || 20;
print "Number of threads: $count\n";

my $q = Thread::Queue->new;
my @threads;
for (0 .. $count - 1)
{
    push @threads, async {
        while (defined (my $f = $q->dequeue))
        {
            read_file ($f);
        }
    };
}

for (@files)
{
    $q->enqueue ($_);
}

# Tell workers they are no longer needed.
$q->enqueue (undef) for @threads;

# Wait for workers to end
$_->join for @threads;

print "Complete\n";
1;

sub read_file { ... }


3. fork() + Parallel::ForkManager
Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#!/usr/bin/perl

use strict;
use warnings;
use Parallel::ForkManager;

my @files = `ls *.bz2`;
die "No *.bz2 files\n" if scalar @files == 0;

my $count = shift || 20;
print "Number of forks: $count\n";

my $pm = Parallel::ForkManager->new ($count);
for my $file (@files)
{
    my $pid = $pm->start and next;
    my $cmd = "perl read_file.pl $file"; # Отдельный скрипт для обработки файла (аналог подпрограммы read_file() в примерах выше)
    exec $cmd or die "Unable to launch '$cmd'\n";
    # Will never reach this, but that's ok since it only calls exit.
    $pm->finish;
}
$pm->wait_all_children;

print "Complete\n";
1;

Еще примеры с fork()
...
Рейтинг: 0 / 0
20.06.2013, 11:40
    #38304418
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
mhx,

Спасибо за помощь!

Из опыта, какой метод порекомендуете для максимальной производительности ?
...
Рейтинг: 0 / 0
20.06.2013, 11:42
    #38304432
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Testor1mhx,

Спасибо за помощь!

Из опыта, какой метод порекомендуете для максимальной производительности ?

По производительности, надежности и отслеживанию исключений.
...
Рейтинг: 0 / 0
21.06.2013, 07:48
    #38305634
Gijad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Testor1,
Может проще поступить, и запустить из командной строки столько процессов сколько вам нужно?
...
Рейтинг: 0 / 0
23.06.2013, 13:01
    #38307337
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Gijad,

мне нужно чтобы все работало стабильно и в случае сбоев была нотификация и корректная обработка ошибок. полагаю что лучше все писать одним скриптом и внутри реализовать логику обработки
...
Рейтинг: 0 / 0
24.06.2013, 07:59
    #38307775
Gijad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Testor1,
Можно примерно так:
Ваш скрипт запустит несколько процессов из командной строки для архивирования, можно использовать 7zip. Они заархивировались, после чего запустите их разархивироваться во временную папку. После чего считаете md5 от исходных файлов и разархивированными файлами во временной папке, сравниваете их. Если всё совпадает, удаляете всё кроме архивов.
...
Рейтинг: 0 / 0
24.06.2013, 22:06
    #38308786
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
ТС, А может mono? Оно вам роднее и под никсами работает.
...
Рейтинг: 0 / 0
27.06.2013, 13:39
    #38312550
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
GijadTestor1,
Можно примерно так:
Ваш скрипт запустит несколько процессов из командной строки для архивирования, можно использовать 7zip. Они заархивировались, после чего запустите их разархивироваться во временную папку. После чего считаете md5 от исходных файлов и разархивированными файлами во временной папке, сравниваете их. Если всё совпадает, удаляете всё кроме архивов.

Не пойдет. Обработку надо делать на лету, без создания промежуточного файла. Нужно будет использовать потоки. Файлы в архиве очень большие.
...
Рейтинг: 0 / 0
27.06.2013, 13:39
    #38312552
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
WarstoneТС, А может mono? Оно вам роднее и под никсами работает.

Нельзя, а так я за !
...
Рейтинг: 0 / 0
29.06.2013, 23:27
    #38314896
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Testor1WarstoneТС, А может mono? Оно вам роднее и под никсами работает.

Нельзя, а так я за !А почему? В mono есть билд в натив, когда проме ехе больше ничего не надо (ну почти).

Ну а вообще остальное уже все написали. мое ИМХО: fork + кормление по пайпам.
...
Рейтинг: 0 / 0
30.06.2013, 21:33
    #38315210
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
WarstoneTestor1пропущено...


Нельзя, а так я за !А почему? В mono есть билд в натив, когда проме ехе больше ничего не надо (ну почти).

Ну а вообще остальное уже все написали. мое ИМХО: fork + кормление по пайпам.

Запрещено. Обсуждению не подлежит :(
Использую то, что разрешено.
...
Рейтинг: 0 / 0
01.07.2013, 23:42
    #38316504
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Perl] Многопотоковая обработка файлов
Testor1,

Тогда вам все сказали )
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Perl] Многопотоковая обработка файлов / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]