09
Июн
2017

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

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

Источник: https://ru.stackoverflow.com/questions/677328/%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B3%D0%BE-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0

Share

Тебе может это понравится...