задача: удалить дубли (строки) из текстового файла (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) Записать выходной файл, пробежав по созданному индексу.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники