Можно ли распараллелить сортировку?

13

Например, bzipесть pbzip , параллельная версия bzip. Есть ли такие инструменты распараллеливания для sortповышения производительности?

Мик
источник

Ответы:

12

Начиная с coreutils 8.6 (2010-10-15), GNU sortуже сортирует параллельно, чтобы использовать несколько процессоров, где они доступны. Таким образом, он не может быть улучшен в этом отношении, как pigzили pbzip2улучшить gzipили bzip2.

Если у вас sortнет параллели, вы можете попробовать установить GNU sortиз последней версии GNU coreutils .

С помощью сортировки GNU вы можете ограничить количество потоков с помощью --parallelопции.

Стефан Шазелас
источник
2
sort --stable дает повышение производительности на 15%, по крайней мере, в моей тестовой рабочей нагрузке.
jrw32982 поддерживает Монику
8

Одна вещь, которая всегда помогает мне больше всего в сортировке, - это выделение для нее как можно большего объема памяти, чтобы уменьшить обмен, например:

sort -S 20G
benroth
источник
4
Спасибо, это трюк, который я тоже использую в последнее время - просто позвольте сортировке использовать половину оперативной памяти, если это необходимо:sort -S 50%
miku
6

Если ваш файл достаточно велик, сортировка приведет к подкачке диска, либо из-за того, что выделенная виртуальная память становится слишком большой, либо из-за того, что sortсама программа переставляет фрагменты на диск и обратно. В старых sortреализациях такой тип поведения «сортировка по дисковому буферу» более вероятен, поскольку в старые времена это был единственный способ сортировки больших файлов.

sortесть -mвариант, который может помочь вам здесь. Возможно, быстрее будет разбить файл на куски, скажем, с помощью split -lсортировки, а затем объединить их вместе.

С другой стороны, может случиться так, что это именно то, что делает «сортировка через дисковый буфер». Единственный способ выяснить, помогает ли это, - сравнить его с вашей конкретной тестовой нагрузкой. Критическим параметром будет количество строк, которое вы дадите split -l.

Уоррен Янг
источник
Спасибо за Ваш ответ. Я буду проводить некоторые тесты с splitи mergeи посмотреть , если это помогает.
мику
@miku: я не вижу merge(1)здесь применимости. Использование sort -m.
Уоррен Янг
1
простите за мою слабость, я имел в виду sort --merge.
мику
1
Если вы разделите файл и отсортируете части, вам все равно придется отсортировать все, когда вы соберете все вместе, верно? Как это будет быстрее?
Terdon
2
Это вариант алгоритма сортировки слиянием , один из самых быстрых доступных методов сортировки.
Уоррен Янг
3

У меня был очень значительный выигрыш при использовании sort -n, который требует числовые значения (с плавающей точкой или целое число) во всех выбранных столбцах, без научной записи.

Еще одна возможность, которая может значительно улучшить ваш процесс, - это использовать папку /dev/shmс отображенной памятью для работы с промежуточными файлами.

Saullo GP Castro
источник
3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Обычно сортировка Linux делает некоторые полезные вещи, чтобы соответствовать правилам равенства Unicode ... если вы измените локаль на C, она переключится только на байт ...

Для файла объемом 1,4 ГБ разница на моей машине составляет 20 с против 400 с (!!!)

mt_
источник
Спасибо, но не будет LC_ALL=Cли этого достаточно?
Мику,
Я так думаю ... может быть LC_COLLATE, уже достаточно. AFAIK sortиспользует strcollдля сравнения, а на странице руководства сказано, что поведение зависит отLC_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

Файл разбит и сортирует, это увеличит скорость сортировки

amicos
источник
1
Здравствуй! Этот ответ может быть улучшен путем объяснения того, что он должен делать, а не просто как дамп кода (также, если бы он был сравнительно быстрым по сравнению с сортировкой GNU на некоторых входных данных, было бы интересно узнать!).
дхаг