Это интересно. Я действительно не знаю, как это работает, но у меня есть предположение. Вероятно, он помещает первый символ каждого ключа в двоичное дерево, а при конфликте он также использует следующий символ ключа, поэтому он не сохраняет больше ключа, чем нужно. Затем он может сохранить смещение в файл с каждым ключом, чтобы он мог искать и печатать каждую строку по порядку.
Зифре
На самом деле, @ayaz более интересен, если вы сортируете файл не на диске, а в конвейере, поскольку он делает очевидным, что вы не можете просто выполнить несколько проходов по входным данным.
tvanfosson
3
Почему все на SO так хотят все время гадать?
Вы можете выполнять несколько проходов ввода - вам просто нужно прочитать весь ввод, записать его на диск, а затем отсортировать файл на диске.
2
@Neil - из контекста казалось очевидным, что он пытался отсортировать содержимое файла, а не имя файла (что для одного имени бессмысленно). Я просто хотел улучшить вопрос, не меняя слишком сильно контекст, чтобы получить ответы вместо отрицательных голосов из-за простой ошибки.
tvanfosson
Ответы:
111
В алгоритмические детали команды UNIX Сортировка говорит Unix Сортировка использует алгоритм в слияние внешнего R-Way сортировки. Ссылка дает более подробную информацию, но по сути она делит ввод на более мелкие части (которые помещаются в память), а затем объединяет каждую часть вместе в конце.
ПРЕДУПРЕЖДЕНИЕ. Этот сценарий запускает одну оболочку для каждого фрагмента, для действительно больших файлов их может быть сотни.
Вот сценарий, который я написал для этой цели. На машине с 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 lineif[ $# != 2 ]then
usage
exitfi#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_PREFIXfor 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
Вы можете просто использовать sort --parallel N как GNU sort версии 8.11
jhclark
5
GNU coreutils 8.6 на самом деле
bdeonovic
1
Это помогло мне. У меня вроде 8.4 версия. Использование сортировки непосредственно в файле (190 миллионов строк) ни к чему не привело. Эта программа сделала это менее чем за 4 минуты
Сунил Би
опять же, этот ответ не имеет ничего общего с вопросом
WattsInABox
2
Этот сценарий опасен. Моя Linux-машина потеряла отклик после запуска сотен процессов сортировки…
Yongwei Wu
11
Я не знаком с программой, но полагаю, что это делается с помощью внешней сортировки (большая часть проблемы хранится во временных файлах, в то время как относительно небольшая часть проблемы сохраняется в памяти одновременно). См. Книгу Дональда Кнута « Искусство программирования», том. 3 Сортировка и поиск, раздел 5.4 для очень глубокого обсуждения предмета.
Это отлично. Не знал, что есть параллельный пакет! Время сортировки улучшилось более чем на 50% после использования вышеуказанного. Спасибо.
xbsd
Я попытался использовать comm для сравнения файлов, сгенерированных этим, и он предупреждал меня, что файлы не отсортированы.
ashishb 01
7
Внимательно изучите варианты сортировки, чтобы повысить производительность и понять, как это влияет на вашу машину и проблему. Ключевые параметры Ubuntu:
Расположение временных файлов -T имя_каталога
Объем используемой памяти -SN% (N% всей используемой памяти, чем больше, тем лучше, но избегайте излишней подписки, которая вызывает подкачку на диск. Вы можете использовать это как «-S 80%», чтобы использовать 80% доступной оперативной памяти, или «-S 2G» для 2 ГБ ОЗУ.)
Спрашивающий спрашивает: "Почему не используется много памяти?" Ответ на этот вопрос исходит из истории: старые unix-машины были небольшими, а размер памяти по умолчанию установлен маленьким. Настройте его как можно больше для вашей рабочей нагрузки, чтобы значительно улучшить производительность сортировки. Установите рабочий каталог в такое место на самом быстром устройстве, на котором достаточно места для хранения не менее 1,25 * размера сортируемого файла.
попробовав это на файле размером 2,5 ГБ, на коробке с 64 ГБ ОЗУ с -S 80%, он фактически использует этот полный процент, даже если весь файл меньше этого. это почему? даже если в нем не используется сортировка на месте, которая кажется беспричинной
Джозеф Гарвин
Вероятно, sort -S заранее выделяет память для процесса сортировки даже до чтения содержимого файла.
Фред Ганнетт
-3
Память не должна быть проблемой - sort уже позаботится об этом. Если вы хотите оптимально использовать свой многоядерный процессор, я реализовал это в небольшом скрипте (похожем на те, которые вы можете найти в сети, но проще / чище, чем большинство из них;)).
#!/bin/bash# Usage: psort filename <chunksize> <threads># In this example a the file largefile is split into chunks of 20 MB.# The part are sorted in 4 simultaneous threads before getting merged.# # psort largefile.txt 20m 4 ## by h.p.
split -b $2 $1 $1.part
suffix=sorttemp.`date +%s`
nthreads=$3
i=0for fname in`ls *$1.part*`do
let i++
sort $fname > $fname.$suffix &
mres=$(($i % $nthreads))
test "$mres"-eq 0&& wait
done
wait
sort -m *.$suffix
rm $1.part*
Ответы:
В алгоритмические детали команды UNIX Сортировка говорит Unix Сортировка использует алгоритм в слияние внешнего R-Way сортировки. Ссылка дает более подробную информацию, но по сути она делит ввод на более мелкие части (которые помещаются в память), а затем объединяет каждую часть вместе в конце.
источник
Команда
sort
сохраняет рабочие данные во временных файлах на диске (обычно в формате/tmp
).источник
-T
для указания временногоПРЕДУПРЕЖДЕНИЕ. Этот сценарий запускает одну оболочку для каждого фрагмента, для действительно больших файлов их может быть сотни.
Вот сценарий, который я написал для этой цели. На машине с 4 процессорами производительность сортировки улучшилась на 100%!
См. Также: « Ускорение сортировки больших файлов с помощью сценария оболочки »
источник
Я не знаком с программой, но полагаю, что это делается с помощью внешней сортировки (большая часть проблемы хранится во временных файлах, в то время как относительно небольшая часть проблемы сохраняется в памяти одновременно). См. Книгу Дональда Кнута « Искусство программирования», том. 3 Сортировка и поиск, раздел 5.4 для очень глубокого обсуждения предмета.
источник
источник
Внимательно изучите варианты сортировки, чтобы повысить производительность и понять, как это влияет на вашу машину и проблему. Ключевые параметры Ubuntu:
Спрашивающий спрашивает: "Почему не используется много памяти?" Ответ на этот вопрос исходит из истории: старые unix-машины были небольшими, а размер памяти по умолчанию установлен маленьким. Настройте его как можно больше для вашей рабочей нагрузки, чтобы значительно улучшить производительность сортировки. Установите рабочий каталог в такое место на самом быстром устройстве, на котором достаточно места для хранения не менее 1,25 * размера сортируемого файла.
источник
Память не должна быть проблемой - sort уже позаботится об этом. Если вы хотите оптимально использовать свой многоядерный процессор, я реализовал это в небольшом скрипте (похожем на те, которые вы можете найти в сети, но проще / чище, чем большинство из них;)).
источник