Чи можна паралелізувати сортування?


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

4
Дякую, це трюк, яким я користуюсь останнім часом теж - просто дозволь сортуванню використовувати половину оперативної пам’яті, якщо потрібно:sort -S 50%
miku

6

Якщо ваш файл досить великий, сортування спричинить заміну диска, або тому, що виділена віртуальна пам'ять зростає занадто великою, або через те, що sortсама програма поміняє шматки на диск і назад. Більш sortймовірно, що в старих реалізаціях є така поведінка «сортування за допомогою дискового буфера», оскільки це був єдиний спосіб сортування великих файлів у старі часи.

sortє -mваріант, який може вам тут допомогти. Можливо, буде швидше розділити файл на шматки - скажімо, split -l- сортувати їх самостійно, а потім об'єднати їх назад.

Знову ж таки, можливо, саме це робить "сортування за допомогою дискового буфера". Єдиний спосіб дізнатися, чи допомагає це - це порівняти його на конкретному тестовому навантаженні. Критичним параметром буде кількість рядків, яку ви надаєте split -l.


Дякую за вашу відповідь. Я буду проводити деякі тести з splitі mergeі подивитися , якщо це допомагає.
miku

@miku: Я не бачу, що merge(1)тут є застосовність. Використовуйте sort -m.
Warren Young

1
вибачте за мою млявість, я мав в виду sort --merge.
miku

1
Якщо ви розділите файл і відсортуєте шматки, вам все одно доведеться сортувати всю річ, коли ви складете її знову правильно? Як це буде швидше?
terdon

2
Це варіант алгоритму сортування злиття , одного з найшвидших доступних методів сортування.
Warren Young

3

У мене був дуже значний приріст використання sort -n, що вимагає числових значень (float або integer) у всіх вибраних стовпцях, без наукових позначень.

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


3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Як правило, Linux сортування робить деякі чудові речі, щоб відповідати правилам рівності Unicode ... якщо ви зміните локаль на C, він переходить лише на байт ...

Для файлу 1,4 ГБ різниця на моїй машині становить 20s проти 400s (!!!)


Дякую, але хіба цього не 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

файл розділений і сортувати, це збільшить швидкість сортування


1
Привіт! Цю відповідь можна було б покращити, пояснивши, що вона має на увазі робити, а не бути лише дампами коду (також, якщо це було орієнтоване на те, щоб бути швидшим за сортування GNU на деякому вході, це було б цікаво знати!).
даг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.