У меня есть ПК с процессором Intel® Pentium® G640 с тактовой частотой 2,80 ГГц и 8 ГБ оперативной памяти. Я использую Scientific Linux 6.5 на нем с файловой системой EXT3.
На этой установке, какой самый быстрый способ я могу сделать sort -u
на 200-гигабайтном файле?
Должен ли я разделить файл на более мелкие файлы (размером менее 8 ГБ), sort -u
объединить их, затем снова разделить на другой размер, sort -u
снова и т. Д.? Или есть какие-нибудь сценарии сортировки, программы, которые могут обрабатывать файлы с таким большим объемом памяти?
/tmp
.parallel
Я думаю, что для этого вам понадобится GNU, а не moreutilsparallel
, установленный по умолчанию в некоторых системах.sort(1)
может не хватить места на/tmp
; если это так, вы можете назначить другую область для временных файлов с помощью переменной средыTMPDIR
или флага-T=<tmpdir>
Ответы:
GNU
sort
(который используется по умолчанию в большинстве систем Linux), имеет--parallel
опцию. С http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Поскольку ваш процессор имеет 2 ядра, вы можете сделать:
Лучше указать фактическое количество ядер, так как может показаться, что их больше из-за того, что процессор имеет гиперпоточность .
Вы также можете поэкспериментировать с
nice
влиянием приоритета планирования процессора и планированиемionice
ввода / вывода. Вы можете увеличить приоритет над другими процессами, подобными этим, я не думаю, что это даст вам большую экономию, поскольку они обычно лучше для обеспечения того, чтобы фоновый процесс не использовал слишком много ресурсов. Тем не менее, вы можете объединить их с чем-то вроде:Также обратите внимание, что, как прокомментировал Жиль , использование одной команды сортировки GNU будет быстрее, чем любой другой метод разрушения сортировки, поскольку алгоритм уже оптимизирован для обработки больших файлов. Все остальное, скорее всего, только замедлит ход событий.
источник
sort
напрямую лучше, чем что-либо еще, что вы могли бы сделать. Сортировка GNU разработана для того, чтобы хорошо справляться с файлами, которые намного больше, чем RAM.Использование
sort
команды, вероятно, будет самым быстрым вариантом.Но вы, вероятно, захотите исправить локаль до C.
sort -u
не сообщает об уникальных строках, но об одном наборе строк, которые сортируются одинаково. В языковом стандарте C две разные строки обязательно не сортируются одинаково, но это не так в большинстве языковых стандартов на основе UTF-8 в системах GNU.Кроме того, использование языкового стандарта C позволяет избежать дополнительных затрат на анализ UTF-8 и обработку сложных порядков сортировки, что значительно повышает производительность.
Так:
Вы также можете повысить производительность, используя более быстрый диск (или диск, отличающийся от того, на котором находятся входные и / или выходные файлы) для временных файлов (используя переменную среды
-T
или$TMPDIR
переменную среды), или переключившись на-S
параметр, поддерживаемый некоторымиsort
реализациями) ,Для некоторого типа ввода или для медленного хранения использование
--compress-program
опции GNUsort
(например, сlzop
) может улучшить производительность в дополнение к использованию хранилища.источник
Вот готовый скрипт bash для сортировки данных в масштабе ТБ на обычном компьютере с парой оперативной памяти в ГБ: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Проверяет количество Ядро вашей машины как и использует все ядра. Можно сортировать, числовые или строковые файлы. Может использоваться для поиска уникальных записей в данных шкалы ТБ.
источник