Я хочу отсортировать списки от 1 до 100 миллиардов элементов в системах с 8-128 ядрами, оперативной памятью для 10% элементов и дисками со скоростью 100-1000 МБ/с.
Я протестировал простую сортировку слиянием, при которой каждое слияние выполняется процессором параллельно:
sorted_part_a:__
\__[CPU.1]__
sorted_part_b:__/ \
\__[CPU.5]__
sorted_part_c:__ / \
\__[CPU.2]__/ \
sorted_part_d:__/ \
\__[CPU.7]
sorted_part_e:__ /
\__[CPU.3]__ /
sorted_part_f:__/ \ /
\__[CPU.6]__/
sorted_part_g:__ /
\__[CPU.4]__/
sorted_part_h:__/
Но у этого есть проблема, заключающаяся в том, что последний шаг слияния [CPU.7
] должен выполнять n сравнений на одном ядре при слиянии двух последних входных данных, а сравнения могут быть дорогостоящими (подумайте о строках, которые должны учитывать настройки локали). ). В моем тесте [CPU.7
] было узким местом.
Затем я изучил красно-черные деревья. У них есть несколько преимуществ:
- когда дерево построено, то получение отсортированного списка
O(n)
без сравнений. Это позволяет избежать узкого места, которое я видел в своем тесте сортировки слиянием. - вы можете параллельно строить деревья и параллельно объединять их, таким образом с использованием нескольких ядер.
- вам не нужны все данные, прежде чем вы сможете начать строить деревья (поэтому, если вы читаете с медленного устройства, вы можете сортировать во время чтения, не тратя время настенных часов).
Сохранение дерева на диск также кажется довольно простым (просто экспортируйте отсортированный список и высоту дерева), но вернуть с диска только часть дерева кажется более сложным.
Я прочитал Какой алгоритм параллельной сортировки имеет лучший средний случай производительность? но, похоже, игнорируется распространенный случай с данными среднего размера: эти данные помещаются на диске сервера, но не помещаются в ОЗУ.
Учитывая аппаратное обеспечение (8-128 ядер, ОЗУ для 10% элементов и диски, обеспечивающие потоковую передачу 100-1000 МБ / с, 1000 iops), как быстрее всего отсортировать списки от 10 ^ 9 до 100 * 10 ^ 9 элементы по 10-100 байт?
С точки зрения непрофессионала:
Каков проверенный и верный способ быстрой сортировки самого большого объема данных, который вы бы отсортировали на одном сервере?
billion
длинный или короткий? - person greybeard   schedule 17.04.2020lcspu
+hwloc
/lstopo
( как в stackoverflow.com/a/50221801 ) для указанной тестируемой системы? Знание реальности как есть помогает разработать наиболее эффективную стратегию, не так ли? ( ... и в самом деле БОЛЬШОЕ СПАСИБО ЗА gnu PARALLEL --jobs 1 echo {} ::: крутой, крутой, крутой, мощный инструмент, сэр ) - person user3666197   schedule 17.04.2020