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

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

Плиз поделитесь кодом или примером как это можно сделать. Я больше программирую на c#, а код нужен именно на perl под юникс.
...
Рейтинг: 0 / 0
[Perl] Многопотоковая обработка файлов
    #38287570
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man fork
man perltut
man perlfunc
...
Рейтинг: 0 / 0
[Perl] Многопотоковая обработка файлов
    #38288135
mhx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mhx
Гость
Ну вот несколько примеров:
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
[Perl] Многопотоковая обработка файлов
    #38304418
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mhx,

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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