задача: удалить дубли (строки) из текстового файла (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 раз, именно на считывание и уходит большинство времени. для С или С++ чтение файла будет происходить гораздо быстрее, если есть возможность привести пример кода - буду благодарен, сам давно не брал сей инструмент в руки - читайте комментарии ниже
Как бы я это делал:
1) Взять C++
2) Загрузить файл в память
3) Многопоточно найти начала строк, построив индекс (массив указателей на начала строк).
4) Отсортировать индекс.
5) Записать выходной файл, пробежав по созданному индексу.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем приветУ меня есть класс для авторизации пользователя, в котором находится переменная int id пользователя