У меня есть текстовый файл объемом 500 ГБ, содержащий около 10 миллиардов строк, которые нужно сортировать в алфавитном порядке. Каков наилучший алгоритм? Могут ли быть улучшены мои настройки и настройки?
В настоящее время я использую команду sortutils sort:
LANG=C
sort -k2,2 --field-separator=',' --buffer-size=(80% RAM) --temporary-directory=/volatile BigFile
Я запускаю это в AWS EC2 на 120 ГБ оперативной памяти и 16-ядерную виртуальную машину. Это занимает большую часть дня.
/volatile - массив массивов 10ТБ RAID0.
Трюк "LANG = C" обеспечивает ускорение скорости x2 (благодаря 1)
По умолчанию "сортировка" использует 50% доступной ОЗУ. Повышение до 80-90% дает некоторое улучшение.
Я понимаю, что gnu 'sort' - это вариант алгоритма сортировки слияния с O (n log n), который является самым быстрым: см. 2 и 3. Переместился бы в QuickSort help (я доволен нестабильной сортировкой)?
Одна вещь, которую я заметил, это то, что используются только 8 ядер. Это связано с установкой default_max_threads в 8 в linux coreutils sort.c(см. 4). Помогло бы перекомпилировать sort.c с 16?
Спасибо!
ПОСЛЕДУЮЩИЙ:
@dariusz
Я использовал Криса и ваши предложения ниже.
Поскольку данные уже были сгенерированы партиями: я отсортировал каждый блок отдельно (на нескольких отдельных машинах), а затем использовал функцию sort -merge. Работает как шарм и намного быстрее: O (log N/K) против O (log N).
Я также переосмыслил проект с нуля: некоторые данные пост-обработки теперь выполняются во время генерации данных, так что некоторые ненужные данные (шум) могут быть отброшены до начала сортировки.
Все вместе, уменьшение размера данных и сортировка/слияние привели к значительному сокращению вычислительных ресурсов, необходимых для достижения моей цели.
Спасибо за все ваши полезные комментарии.