сортировка большого файла

323
11 июня 2017, 18:35

задача: удалить дубли (строки) из текстового файла (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 раз, именно на считывание и уходит большинство времени. для С или С++ чтение файла будет происходить гораздо быстрее, если есть возможность привести пример кода - буду благодарен, сам давно не брал сей инструмент в руки - читайте комментарии ниже

Answer 1

Как бы я это делал:

1) Взять C++

2) Загрузить файл в память

3) Многопоточно найти начала строк, построив индекс (массив указателей на начала строк).

4) Отсортировать индекс.

5) Записать выходной файл, пробежав по созданному индексу.

READ ALSO
Инициализация переменной в функции

Инициализация переменной в функции

Всем приветУ меня есть класс для авторизации пользователя, в котором находится переменная int id пользователя

216
Изменить класс white на black в &ldquo;select&rdquo; js или jquery

Изменить класс white на black в “select” js или jquery

Есть select с 2 значениями white и black

274