задача: удалить дубли (строки) из текстового файла (1 - 4GB), OS: Windows 7 x64, ОЗУ: 8GB, Perl (v5.24.1).
вопрос: как ускорить процесс (желательно без подключения/установки модулей с cpan)
при использовании скрипта ниже, на 1гб файл уходит в среднем 1,5 часа.
при попытке "загнать" весь файл в хеш (память), вываливается с ошибкой: "out of memory".
в целом, задача сводится к сортировке.
как видно, в скрипте использую алгоритм,
где в хеш добавляются строки которые начинаются с первого символа - таким образом задействуеться меньше памяти.
так же, возможен вариант сортировки по длине строки.
use strict;
use warnings;
my $time = localtime();
my $list = "1.txt";
my % sym;
open A, $list;
while(<A>){
chomp;
next unless $_;
my $s = substr($_, 0, 1);
$sym{$s}++;
}
close A;
for my $sym(sort keys % sym){
#print "$sym\n";
my %h = ();
open A, $list;
while(<A>){
chomp;
my $s = substr($_, 0, 1);
if($s eq $sym){
$h{$_}++;
}
}
close A;
open B, ">>clearlist.txt";
for(sort keys %h){
print B "$_\n";
}
close B;
}
print "$time\n", scalar localtime; <>;
доп: как я понимаю, для ускорения в perl нужно свести к минимуму число итераций, те если всего 94 символа то открытие и считывание файла будет происходить 94+1 раз, именно на считывание и уходит большинство времени. для С или С++ чтение файла будет происходить гораздо быстрее, если есть возможность привести пример кода - буду благодарен, сам давно не брал сей инструмент в руки - читайте комментарии ниже
Свежие комментарии