Модуль MCE для Perl любит большие файлы.С помощью MCE можно разбивать на несколько строк одновременно, отбрасывать большой кусок в виде скалярной строки или читать по 1 строке за раз.Объединение нескольких строк в линию уменьшает накладные расходы для IPC.
MCE 1.504 сейчас отсутствует.Он предоставляет MCE :: Queue поддержку дочерних процессов, включая потоки.Кроме того, версия 1.5 поставляется с 5 моделями (MCE :: Flow, MCE :: Grep, MCE :: Loop, MCE :: Map и MCE :: Stream), которые занимаются созданием экземпляра MCE, а также автоматическимнастройка max_workers и chunk_size.Можно переопределить эти параметры между прочим.
Ниже, MCE :: Loop используется для демонстрации.
use MCE::Loop;
print "Enter a file name: ";
my $dict_path = <STDIN>;
chomp($dict_path);
mce_loop_f {
my ($mce, $chunk_ref, $chunk_id) = @_;
foreach my $line ( @$chunk_ref ) {
chomp $line;
## add your code here to process $line
}
} $dict_path;
Если вы хотите указать количество рабочих и / или chunk_size, то естьЕсть два способа сделать это.
use MCE::Loop max_workers => 5, chunk_size => 300000;
Или ...
use MCE::Loop;
MCE::Loop::init {
max_workers => 5,
chunk_size => 300000
};
Хотя для больших файлов предпочтительнее разбиение на фрагменты, можно сравнить время с разбиением на одну строку за раз.Можно пропустить первую строку внутри блока (закомментировано).Обратите внимание, что нет необходимости во внутреннем цикле for.$ chunk_ref по-прежнему является ссылкой на массив, содержащей 1 строку.Входной скаляр $ _ содержит строку, когда chunk_size равен 1, в противном случае указывает на $ chunk_ref.
use MCE::Loop;
MCE::Loop::init {
max_workers => 5,
chunk_size => 1
};
print "Enter a file name: ";
my $dict_path = <STDIN>;
chomp($dict_path);
mce_loop_f {
# my ($mce, $chunk_ref, $chunk_id) = @_;
my $line = $_;
## add your code here to process $line or $_
} $dict_path;
Я надеюсь, что эта демонстрация была полезна для людей, желающих обрабатывать файл параллельно.
:) Марио