it-swarm.com.ru

Как команда сортировки UNIX может отсортировать очень большой файл?

Команда UNIX sort может отсортировать очень большой файл следующим образом:

sort large_file

Как реализован алгоритм сортировки?

Почему это не вызывает чрезмерного потребления памяти?

96
yjfuk

Алгоритмические подробности команды сортировки UNIX говорит, что сортировка Unix использует алгоритм сортировки слиянием по внешнему R-образному пути. Ссылка углубляется в детали, но по сути она делит входные данные на более мелкие части (которые помещаются в память), а затем объединяет каждую часть вместе в конце.

106
Matthew

Команда sort сохраняет рабочие данные во временных дисковых файлах (обычно в /tmp).

40
grawity

ПРЕДУПРЕЖДЕНИЕ: Этот скрипт запускает одну оболочку на чанк, для действительно больших файлов это может быть сотни.


Вот сценарий, который я написал для этой цели. На 4-х процессорной машине это улучшило производительность сортировки на 100%!

#! /bin/ksh

MAX_LINES_PER_CHUNK=1000000
ORIGINAL_FILE=$1
SORTED_FILE=$2
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

usage ()
{
     echo Parallel sort
     echo usage: psort file1 file2
     echo Sorts text file file1 and stores the output in file2
     echo Note: file1 will be split in chunks up to $MAX_LINES_PER_CHUNK lines
     echo  and each chunk will be sorted in parallel
}

# test if we have two arguments on the command line
if [ $# != 2 ]
then
    usage
    exit
fi

#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 $file > $file.sorted &
done
wait

#Merging chunks to $SORTED_FILE ...
sort -m $SORTED_CHUNK_FILES > $SORTED_FILE

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

Смотрите также: " Сортировка больших файлов быстрее с помощью скрипта Shell "

13
Adrian

Я не знаком с программой, но думаю, что это делается с помощью внешней сортировки (большая часть проблемы хранится во временных файлах, тогда как относительно небольшая часть проблемы хранится в памяти одновременно). Смотрите Donald Knuth's Искусство компьютерного программирования, том 3, Сортировка и поиск, раздел 5.4 для очень глубокого обсуждения предмета.

11
pico
#!/bin/bash

usage ()
{
    echo Parallel sort
    echo usage: psort file1 file2
    echo Sorts text file file1 and stores the output in file2
}

# test if we have two arguments on the command line
if [ $# != 2 ]
then
    usage
    exit
fi

pv $1 | parallel --pipe --files sort -S512M | parallel -Xj1 sort -S1024M -m {} ';' rm {} > $2
11
Sergio

Внимательно изучите параметры сортировки для ускорения производительности и поймите, как это влияет на вашу машину и проблемы. Основные параметры в Ubuntu:

  • Расположение временных файлов -T directory_name
  • Объем используемой памяти -SN% (N% всей используемой памяти, чем больше, тем лучше, но избегайте чрезмерной подписки, которая приводит к подкачке на диск. Вы можете использовать ее как "-S 80%", чтобы использовать 80% доступной оперативной памяти, или "-S 2G" для 2 ГБ ОЗУ.)

Спрашивающий спрашивает: "Почему нет высокого использования памяти?" Ответ на этот вопрос приходит из истории, старые машины с Unix были маленькими, а размер памяти по умолчанию был небольшим. Отрегулируйте это как можно больше для своей рабочей нагрузки, чтобы значительно повысить производительность сортировки. Установите рабочий каталог на место на вашем самом быстром устройстве, на котором достаточно места для хранения не менее 1,25 * размера сортируемого файла.

5
Fred Gannett