Czy mogę równolegle sortować?

13

Na przykład bzipistnieje pbzip , równoległa wersja bzip. Czy istnieją takie narzędzia do paralelizacji w sortcelu poprawy wydajności?

miku
źródło

Odpowiedzi:

12

Począwszy od coreutils 8.6 (2010-10-15), GNU sortsortuje już równolegle, aby korzystać z kilku procesorów, jeśli są dostępne. Tak więc nie można go dalej ulepszać pod tym względem, jak pigzlub pbzip2poprawić gziplub bzip2.

Jeśli sortnie jesteś równoległy, możesz spróbować zainstalować GNU sortz najnowszej wersji jądra GNU .

Za pomocą opcji GNU sort można ograniczyć liczbę wątków za pomocą --parallelopcji.

Stéphane Chazelas
źródło
2
sort --stable daje 15% wzrost wydajności, przynajmniej w moim obciążeniu testowym.
jrw32982 obsługuje Monikę
8

Jedyną rzeczą, która zawsze mi najbardziej pomaga w sortowaniu, jest zapewnienie jak największej ilości pamięci, aby ograniczyć zamianę, np .:

sort -S 20G
Benroth
źródło
4
Dzięki, to jest również sztuczka, której ostatnio używam - pozwól sortowi użyć połowy pamięci RAM, jeśli to konieczne:sort -S 50%
miku
6

Jeśli plik jest wystarczająco duży, sortowanie spowoduje zamianę dysku, albo z powodu zbyt dużej ilości przydzielonej pamięci wirtualnej, albo dlatego, że sortsam program zamienia fragmenty na dysk iz powrotem. Starsze sortimplementacje częściej zachowują się jak w przypadku „sortowania według bufora dysku”, ponieważ w przeszłości był to jedyny sposób sortowania dużych plików.

sortma -mopcję, która może ci w tym pomóc. Szybsze może być podzielenie pliku na części - powiedzmy za pomocą split -l- sortowanie ich niezależnie, a następnie scalenie ich z powrotem.

Z drugiej strony może się zdarzyć, że właśnie to robi „sortuj według bufora dysku”. Jedynym sposobem, aby dowiedzieć się, czy to pomaga, jest przetestowanie go pod kątem konkretnego obciążenia testowego. Najważniejszym parametrem będzie liczba linii, którą podasz split -l.

Warren Young
źródło
Dziękuję za odpowiedź. Będę prowadzić niektóre z punktów odniesienia spliti mergei zobacz czy to pomaga.
miku
@miku: Nie widzę, żeby merge(1)miało to zastosowanie tutaj. Zastosowanie sort -m.
Warren Young,
1
Przepraszam za moją wiotkość, miałem na myśli sort --merge.
miku
1
Jeśli podzielisz plik i posortujesz elementy, nadal będziesz musiał posortować całość po ponownym złożeniu, prawda? Jak to będzie szybsze?
terdon
2
Jest to wariant algorytmu sortowania scalonego, jednej z najszybszych dostępnych metod sortowania.
Warren Young,
3

Miałem bardzo znaczący zysk przy użyciu sort -n, który wymaga wartości liczbowych (liczba zmiennoprzecinkowa lub liczba całkowita) we wszystkich wybranych kolumnach, bez notacji naukowej.

Inną możliwością, która może przynieść znaczną poprawę procesu, jest użycie folderu odwzorowanego w pamięci /dev/shmdo obsługi plików pośrednich.

Saullo GP Castro
źródło
3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Zwykle sortowanie w Linuksie robi kilka fajnych rzeczy, aby zachować zgodność z regułami równości Unicode ... jeśli zmienisz ustawienia regionalne na C, przełącza się tylko na bajty ...

W przypadku pliku 1,4 GB różnica na moim komputerze to 20s vs. 400s (!!!)

Mt_
źródło
Dzięki, ale czy to nie LC_ALL=Cwystarczy?
miku
Myślę, że tak ... może LC_COLLATEjuż wystarczy. AFAIK sortużywa strcolldo porównania, a strona mówi, że zachowanie zależy odLC_COLLATE
mt_
0
#! /bin/sh
#config MAX_LINES_PER_CHUNK based on file length
MAX_LINES_PER_CHUNK=1000 
ORIGINAL_FILE=inputfile.txt
SORTED_FILE=outputfile.txt
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

 #Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
rm -f $SORTED_FILE

#Splitting $ORIGINAL_FILE into chunks ...
split -l $MAX_LINES_PER_CHUNK $ORIGINAL_FILE $CHUNK_FILE_PREFIX

for file in $CHUNK_FILE_PREFIX*
do
    sort -n -t , -k 1,1 $file > $file.sorted &
done
wait

#echo "**********SORTED CHUNK FILES*********"
#echo $SORTED_CHUNK_FILES
#Merging chunks to $SORTED_FILE ...
sort  -mn $SORTED_CHUNK_FILES > $SORTED_FILE

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null

plik zostanie podzielony i posortowany, zwiększy to szybkość sortowania

Amicos
źródło
1
Cześć! Ta odpowiedź może zostać poprawiona poprzez wyjaśnienie, co ma robić, a nie tylko zrzut kodu (także, jeśli przy niektórych danych wejściowych został przetestowany pod kątem szybszego działania niż sortowanie GNU, to warto wiedzieć!).
dhag