Mam komputer z procesorem Intel® Pentium® G640 @ 2,80 GHz i 8 GB pamięci RAM. Używam na nim Scientific Linux 6.5 z systemem plików EXT3.
W tej konfiguracji, jaki jest najszybszy sposób sort -u
na wykonanie pliku o pojemności 200 gigabajtów?
Czy powinienem podzielić plik na mniejsze pliki (mniejsze niż 8 GB), sort -u
złożyć je razem, a następnie ponownie podzielić na inny rozmiar sort -u
itp.? A może istnieją jakieś skrypty sortujące, programy, które mogłyby obsługiwać tak duże pliki przy mojej ograniczonej ilości pamięci RAM?
/tmp
.parallel
Myślę, że będziesz potrzebować GNU do tego, a nie moreutils,parallel
który jest domyślnie instalowany w niektórych systemach.sort(1)
może zabraknąć miejsca na/tmp
; jeśli tak, możesz wyznaczyć inny obszar dla plików tymczasowych ze zmienną środowiskowąTMPDIR
lub flagą-T=<tmpdir>
Odpowiedzi:
GNU
sort
(który jest domyślny w większości systemów Linux), ma--parallel
opcję. From http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Ponieważ twój procesor ma 2 rdzenie, możesz:
Lepiej jest podać rzeczywistą liczbę rdzeni, ponieważ może się wydawać, że jest ich więcej, ponieważ procesor ma hiperwątkowość .
Możesz także eksperymentować z
nice
wpływaniem na priorytet szeregowania procesora iionice
na harmonogram we / wy. Możesz zwiększyć priorytet w stosunku do innych procesów takich jak ten, nie sądzę, aby to przyniosło duże oszczędności, ponieważ zwykle są one lepsze, aby proces w tle nie zużywał zbyt wielu zasobów. Niemniej jednak możesz połączyć je z czymś takim jak:Zauważ też, że jak skomentował Gilles , użycie pojedynczego polecenia sortowania GNU będzie szybsze niż jakakolwiek inna metoda podziału sortowania, ponieważ algorytm jest już zoptymalizowany do obsługi dużych plików. Wszystko inne prawdopodobnie tylko spowolni sytuację.
źródło
sort
bezpośrednie dzwonienie jest lepsze niż cokolwiek innego, co możesz sobie wyobrazić. Sortowanie GNU jest zaprojektowane tak, aby dobrze radzić sobie z plikami, które są znacznie większe niż RAM.Użycie
sort
polecenia będzie prawdopodobnie najszybszą opcją.Ale prawdopodobnie będziesz chciał naprawić ustawienia regionalne na C.
sort -u
nie zgłasza unikalnych wierszy, ale jeden z każdego zestawu wierszy sortujących to samo. W ustawieniach regionalnych C 2 różne linie niekoniecznie muszą być takie same, ale nie jest tak w przypadku większości ustawień narodowych opartych na UTF-8 w systemach GNU.Ponadto użycie ustawień regionalnych C pozwala uniknąć nakładów związanych z analizowaniem UTF-8 i przetwarzaniem złożonych zamówień sortowania, co znacznie poprawiłoby wydajność.
Więc:
Możesz także poprawić wydajność, używając szybszego dysku (lub innego niż ten, na którym znajdują się pliki wejściowe i / lub wyjściowe) dla plików tymczasowych (przy użyciu
-T
lub$TMPDIR
zmiennej środowiskowej), lub bawiąc się-S
opcją obsługiwaną przez niektóresort
implementacje) .W przypadku niektórych typów danych wejściowych lub do wolnego przechowywania, użycie
--compress-program
opcji GNUsort
(na przykład zlzop
) może poprawić wydajność oprócz wykorzystania pamięci.źródło
Oto gotowy do użycia skrypt bash do sortowania danych w skali TB na zwykłym komputerze z kilkoma GB RAM: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Sprawdza liczbę rdzenie maszyny jako i używa wszystkich rdzeni. Może sortować pliki numeryczne lub ciągowe. Może służyć do znajdowania unikalnych rekordów w danych w skali TB.
źródło