задача: удалить дубли (строки) из текстового файла (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) Записать выходной файл, пробежав по созданному индексу.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем приветУ меня есть класс для авторизации пользователя, в котором находится переменная int id пользователя