2013-08-12 27 views
6

Mam bardzo duży plik, ponad 100 GB (wiele miliardów linii), i chciałbym przeprowadzić sortowanie na dwóch poziomach tak szybko jak to możliwe w systemie unix z ograniczoną pamięcią. Będzie to jeden krok w dużym skrypcie perla, więc chciałbym użyć perla, jeśli to możliwe.Jak efektywnie sortować duży plik na dwóch poziomach?

Jak mogę to zrobić? Moje dane wyglądają następująco:

A 129 
B 192 
A 388 
D 148 
D 911 
A 117 

... Ale za miliardy linii. Najpierw muszę posortować według litery, a następnie według numeru. Łatwiej byłoby użyć sortowania unix, jak ...

sort -k1,2 myfile 

Albo można zrobić to wszystko w Perlu jakoś? Mój system będzie miał coś takiego jak 16GB RAM, ale plik ma około 100 GB.

Dzięki za wszelkie sugestie!

+0

Czy wszystkie numery 3 cyfry? Jeśli nie, to czy są one wyrównane do prawej? Jeśli oba te warunki są spełnione (wszystkie 3 cyfry lub wyrównane do prawej), potrzebujesz tylko jednego poziomu sortowania tekstowego. –

+0

@ Jim, dzięki za komentarz. Nie, liczby mieszczą się w przedziale 1-100 000 000, a są to tylko dwie nieprzylegające kolumny większego arkusza kalkulacyjnego (dane sekwencjonowania genomu) – jake9115

Odpowiedz

8

Narzędzie UNIX sort może obsługiwać sortowanie dużych danych (na przykład większe niż 16GB pamięci roboczej RAM), tworząc tymczasowe pliki robocze na dysku.

Tak, polecam po prostu za pomocą UNIX sort za to jak już zasugerował, powołując się na opcję -T tmp_dir i upewniając się, że tmp_dir ma wystarczająco dużo miejsca na dysku do przechowywania wszystkich tymczasowych plików roboczych, które zostaną tam utworzone.

Nawiasem mówiąc, jest to omówione w previous SO question.

1

UNIX sort jest najlepszym rozwiązaniem dla sortowania danych tej skali. Polecam użyć do tego celu algorytmu szybkiej kompresji LZO. Jest zwykle rozpowszechniany jako lzop. Ustaw bufor dużego sortowania za pomocą opcji -S. Jeśli masz dysk większy niż tam, gdzie masz domyślny /tmp zestaw również -T. Ponadto, jeśli chcesz sortować według numeru, musisz zdefiniować sortowanie sortowania jako drugie pole sortowania. Powinieneś więc użyć linii tak, aby uzyskać najlepszą wydajność:

LC_ALL=C sort -S 90% --compress-program=lzop -k1,1 -k2n 
0

Miałem dokładnie ten sam problem! Po wyszukaniu dużo, a ponieważ nie chciałem żadnego uzależnienia od płaszcza (UNIX), aby go przenośny na oknach wymyśliłem rozwiązania poniżej:

#!/usr/bin/perl 
use File::Sort qw(sort_file); 
my $src_dic_name = 'C:\STORAGE\PERSONAL\PROJECTS\perl\test.txt'; 
sort_file({k => 1, t=>" ", I => $src_dic_name, o => $src_dic_name.".sorted"}); 

Wiem, że to stary post, ale jej uaktualnianie z rozwiązaniem, które łatwo jest znaleźć.

Documentation here

Powiązane problemy