Я ищу замену высокой производительности / bin / sort. Я знаю, что есть pbzip2 для использования нескольких ядер, но есть ли аналогичный продукт для / bin / sort?
Я нашел distsort.sh, но мне нужно что-то менее интенсивное по вводу-выводу. Я хочу отсортировать ох .. 60 гигабайт данных на очень частой основе.
При поиске я нашел много ссылок на научные статьи и один коммерческий продукт под названием Nsort. Я ничего не знаю об этом, кроме того, что их веб-сайт утверждает, что:
Nsort - это программа сортировки / слияния, которая может быстро сортировать большие объемы данных, используя большое количество процессоров и дисков параллельно. Nsort - единственная коммерческая программа сортировки, обладающая уникальной эффективностью процессора и демонстрирующая:
- Сортировка 1 терабайт (33 минуты)
- Скорость чтения и записи файлов 1 гигабайт / с
Nsort имеет долгую историю сортировки массивных производственных наборов данных, таких как:
- Веб-журналы для веб-сайтов с высокой посещаемостью
- Журналы телефона
- Данные государственного агентства
Грм. Думаю, здесь вы столкнетесь с несколькими проблемами. Прежде всего, ваши входные данные будут иметь большое влияние на производительность сортировки (разные алгоритмы работают лучше или хуже в зависимости от распределения входных данных). Однако большая проблема заключается в том, что 60 ГБ - это много данных.
Кроме того, сортировка не так проста, как сжатие, потому что нет гарантий близости. Другими словами, с помощью сжатия / распаковки вы можете разбить ввод на дискретные части и работать с ними по отдельности и независимо. После обработки каждого фрагмента они просто объединяются вместе. С сортировкой у вас есть несколько шагов, потому что вы не можете просто объединить результаты (если вы не выполните некоторую предварительную обработку), вам нужно объединить результаты (потому что запись в начале 60 ГБ может оказаться рядом с записью в конце 60гб, после сортировки).
В основном я могу придумать здесь несколько общих решений:
Не зная больше о ваших данных и специфике того, что вы делаете, это лучшее, что я могу предложить в качестве предложений.
[Примечание: я не эксперт по сортировке, поэтому кто-то более умный, чем я, может указать на ошибки в моей логике или предложения по их улучшению.]
GNU sort
имеет -m, который, вероятно, может вам помочь. Предположим, у вас есть 200 файлов .gz, которые вы хотите отсортировать и объединить. Затем вы можете использовать GNU Parallel для:
seq 1 200 | parallel mkfifo /tmp/{}
ls *.gz | nice parallel -j200 'zcat {} | sort >/tmp/$PARALLEL_SEQ' &
seq 1 200 | parallel -X sort -m /tmp/{} >/tmp/sorted
Если проблема связана с вводом-выводом, а память не является проблемой, используйте -S для первого sort
чтобы все осталось в памяти. Также вы можете использовать lzop
каждый раз, когда вы пишете на диск (--compress-program = lzop): диски часто являются ограничивающим фактором, поэтому lzopping на лету может дать вам дополнительную скорость. Или вы можете создать RAM-диск и установить -T для этого каталога.
Изменить: Ну, эта статья о настройке Perl sort perf. Насколько я могу понять из этого, это в основном руководство по передовой практике, в котором сравнивается, как плохой код сортировки может сделать вашу программу очень медленной, и, наоборот, как сделать ее быстрее.
Небрежное программирование, неаккуратное исполнение.