|
|
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
[quot mayton]maytonЯ не просто так делаю акценты на дисковой подсистеме. Если в 1-й фазе для тебя важна скорость сортировки блока в оперативке (можно поискать мультипоточный хоар) То в фазе №2 у нас будет суровое физическое ограничение. Вы хоть в 16 ядер запускайте merge двух блоков (файлов) но события ожидания у вас выстроятся в очередь на канале вашего жесткого диска. Задача первой фазы максимально быстро подготовить работу для начала второй. Первые слияния можно сделать в памяти. Например: 3 ядра сортируют, двое выдали по сортированному блоку, запускаем слияние их в памяти, получаем слитый результат, третий выдал свой блок, запускаем слияние во временный файл. Точнее запуск слияния в файл надо по доступной оперативке подгонять, как только ее не хватает для слияния то лить результат в файл, т.к. слияние в памяти требует места столько же сколько исходные блоки занимают. Как только образовалось два файла - начинаем слияния на уровне файлов. maytonФактически фаза 2 представляет из себя сплошное дисковое копирование. И если кто-то из вас часто и много копировал большие файлы (бэкапы) а я - много копировал, то вы представляете себе масштаб трагедии. Если у вас не RAID стойка - а обычная рабочая станция то никакого масштабирования не будет. Не забывай: сортировка еще идет. В твоей постановке (данные в 4 раза больше) первые два файла мы получим обработав примерно 5-ю часть исходных данных. В реальной задаче (из за которой я в тот топик и писал): сортировка почти сортированной таблицы ~15 тыс. строк, 200 таблиц сортировались 5 сек. однопоточно, в файле одна таблица занимала ~1,5 Мб, т.е. скорость сортировки всего 60 Мб/сек (300 Мб / 5 сек) Какие рэйды? Рядовой HDD на 100% загрузить бы. Допустим у нас 4 ядра с HT (+60% дает, в топике про акторы мерили), т.е. пиковая скорость сортировки 60 * 4 * 1.6 = 384 Мб/сек. Обычный домашний SSD, 500 Мб/сек чтение и запись. Т.е. скидать все на диск успеваем пока сортировка идет. В итоге по окончании сортировки имеем последний отсортированный кусок в памяти и кучку сортированных файлов. Сливать их по два переливая с диска на диск не вариант, много переливаний, тут надо делать слияние из всех сразу. Не намного сложнее по коду. В итоге каждый временный файл будет прочитан однократно и результат записан на диск. Для ускорения этой фазы можно второй диск использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 14:02 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonЕсть 1 сканирование. Это факт. Предлагаю его взять на вооружение. Окей :) Я предлагаю прокатиться на велоОЛАПе и собрать гистограмную статистику. Какие будут варианты ? Предлагаю получить распределение селективности внутри строки. Для случая когда 90% строк в файле имею одинаковый префикс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 14:14 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
д0kХmaytonЕсть 1 сканирование. Это факт. Предлагаю его взять на вооружение. Окей :) Я предлагаю прокатиться на велоОЛАПе и собрать гистограмную статистику. Какие будут варианты ? Предлагаю получить распределение селективности внутри строки. Для случая когда 90% строк в файле имею одинаковый префикс. Добавлю. На 1-м проходе мы можем 1) Сделать общий подсчет строк (N). 2) Используя хеш таблички, контрольные суммы или карту блума сделать count distinct. Здесь я сделаю оговорку что нам не нужен точный подсчет. Можно даже сделать estimation. Пускай это называется (M). 3) Если соотношение M/N близко к 1 - то делаем вывод что строки уникальны и упрощаем алгоритм. Если M/N близко к 0 то делаем вывод что дублей много и форсируем дедупликацию в алгоритме merge. 4) Префиксы. Мне здесь на ум приходит дерево trie и его различные модификации. Здесь я ставлю TODO: research на исследование как префиксное дерево поможет прижать текстовый файл. В некотором гипотетическом варианте если на 1-м проходе данные будут иметь благоприятный расклад - то мы уже получили сортировку деревом и алгоритм закончен. Если мы вываливаемся по OutOfMemory - то надо проанализировать полезную инфу которая пришли из trie и заюзать ее в алгоритме. В этом-же пункте можно развернуть строки в "обратку" и посмотреть суффиксы. 5) Есть смешной (гипотетический вариант) когда на вход нам подали apache или jboss логи и они де-факто уже сортированы (по timestamp) и нам остается просто правильно принять решение о том что сортировка вообще не нужна. Понятно что это нивелирует разработку но согласитесь такой кейс тоже надо рассмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 15:20 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Dima TЗадача первой фазы максимально быстро подготовить работу для начала второй. Первые слияния можно сделать в памяти. Например: 3 ядра сортируют, двое выдали по сортированному блоку, запускаем слияние их в памяти, получаем слитый результат, третий выдал свой блок, запускаем слияние во временный файл. Точнее запуск слияния в файл надо по доступной оперативке подгонять, как только ее не хватает для слияния то лить результат в файл, т.к. слияние в памяти требует места столько же сколько исходные блоки занимают. Да верно. После того как 1-я фаза подготавливает 2 файла (partitions) то 2-я фаза может приступать к слиянию. Я чуть позже нарисую картинкой как я себе это вижу на временной диаграмме а также нарисую своя алгоритм rolling-triangle (это оптимизация дисковой нагрузки). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 15:29 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Dima TНе забывай: сортировка еще идет. В твоей постановке (данные в 4 раза больше) первые два файла мы получим обработав примерно 5-ю часть исходных данных. В исходной постановке я предполагал что не в 4 раза. А более чем в 4 раза. Считай что это big-data. Цифру 4 я просто взял с потолка чтобы отбить желание воспользоваться page/swap технологиями и выдать фейковое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 15:39 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonд0kХпропущено... Я предлагаю прокатиться на велоОЛАПе и собрать гистограмную статистику. Какие будут варианты ? Предлагаю получить распределение селективности внутри строки. Для случая когда 90% строк в файле имею одинаковый префикс. Добавлю. На 1-м проходе мы можем ... На первом проходе надо искать сортированные последовательности, запоминать смещение {начало, размер}. Найти 4-8 самых больших и их не трогать, а чтобы время не терять - мелкие можно сразу в память загонять и по накоплению минимального блока запускать поток сортировки. Если результаты сортировки большие и не умещаются в память, то скидывать во временный файл. По итогу получим N блоков: 1. 4-8 последовательностей из исходного файла 2. сортированный кусок в памяти 3. кучку сортированных временных файлов Дальше принимать решение как смерживать: все сразу или какие-то промежуточные смерживания наименьших кусков сделать. С таким подходом значительно сократится время сортировки, т.к. не будет сортировки сортированного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 16:08 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Смерживание N последовательностей можно свести к многоуровневому смерживанию: Каждый смерживатель имеет на входе две последовательности и выдает на выход минимальный элемент. Далее строим дерево смерживателей в соответствии с количеством входов. По мере заканчивания последовательностей дерево можно перестраивать. Например для 4 последовательностей дерево будет из 3х смерживателей Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 16:20 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Dima TИМХО тут самое узкое место файловый IO, его и надо оптимизировать. В каком-то топике это уже обсуждали. IMHO тут самое узкое место - не конкретное ТЗ. Т.к. в случае если файл 1 Тб и представляет из себя одну очень длинную строчку (или десяток строк по 100 Gb каждая) ... боюсь, файловый IO будет минимальной проблемой ))) maytonДопустим это /tmp. Но для эффективного алгоритма слияния нужны минимум 3 дисковых устройства которые работают независимо. IMHO & AFAIK пофиг. Буферизация рулит. При большом размере буфера, время последовательной чтения/записи + обработка + накладные расходы ОС в какой-то момент превысят потерю времени от перемещения головок. AFAIK Обычно при объеме буфера за 16-64 Mb уже время перемещения головок становится не настолько значимо. Современная RAM вполне позволяет безболезненно под блоки ввода-вывода отдать несколько сотен мегабайт и не париться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 17:18 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonДавайте в форуме один раз и навсегда закодим решение и поставим точку в этих трудностях. https://www.ozon.ru/context/detail/id/2527036/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 17:27 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevПри большом размере буфера, время последовательной чтения/записи + обработка + накладные расходы ОС в какой-то момент превысят потерю времени от перемещения головок. Нет. Речь идет не о накладных расходах на seek, а именно о дисковом параллелизме. Какие буферы не ставь - если у тебя 1 физический диск - пропускная способность сортировки слиянием будет ограничена скоростью твоего канала 1 диска. Причем фактически скорость merge будет менее чем 33% от этой пропускной способности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 18:28 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Dima Tmaytonпропущено... Добавлю. На 1-м проходе мы можем ... На первом проходе надо искать сортированные последовательности, запоминать смещение {начало, размер}. Найти 4-8 самых больших и их не трогать, а чтобы время не терять - мелкие можно сразу в память загонять и по накоплению минимального блока запускать поток сортировки. Если результаты сортировки большие и не умещаются в память, то скидывать во временный файл. Согласен. Добавлю что нас будут интересовать крупные под-последовательности (явно больше чем 10 - 100 строк). И таким образом если логи jboss или apache попадают под это определение - тогда этот исключительный случай будет обобщен как отработка под-последовательности. И не 4-8 а можно и больше. Главное чтоб partitions были крупные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 18:35 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Dima T\/ это смерживатели В моей терминологии это triplet. Тройка. Потому-что две вершины - это как-бы каналы чтения. И одна вершина - это канал записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 19:10 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonLeonid KudryavtsevПри большом размере буфера, время последовательной чтения/записи + обработка + накладные расходы ОС в какой-то момент превысят потерю времени от перемещения головок. Нет. Речь идет не о накладных расходах на seek, а именно о дисковом параллелизме. Какие буферы не ставь - если у тебя 1 физический диск - пропускная способность сортировки слиянием будет ограничена скоростью твоего канала 1 диска. Причем фактически скорость merge будет менее чем 33% от этой пропускной способности. Тогда мне не понятно при чем тут "сортировка слиянием" и "3 диска" Сортировка слиянием крайне замечательно по дискам "размазывается". Ну и понятно, что если есть 10-ть дисков, то скорость явно будет в 10 раз выше, чем с 1 диском. Опять таки, сортировка слиянием эффективна на устройствах с последовательным доступом. На устройствах со случайным доступом ( RAM, SSD ) она большую часть своей прелести теряет. Предположу, что для таких устройств, эффективные алгоритмы (или как минимум параметры алгоритма) будут совершенно другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 20:20 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevmaytonпропущено... Нет. Речь идет не о накладных расходах на seek, а именно о дисковом параллелизме. Какие буферы не ставь - если у тебя 1 физический диск - пропускная способность сортировки слиянием будет ограничена скоростью твоего канала 1 диска. Причем фактически скорость merge будет менее чем 33% от этой пропускной способности. Тогда мне не понятно при чем тут "сортировка слиянием" и "3 диска" Давай пока отложим в сторону 3 диска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 20:26 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonСогласен. Добавлю что нас будут интересовать крупные под-последовательности (явно больше чем 10 - 100 строк). И таким образом если логи jboss или apache попадают под это определение - тогда этот исключительный случай будет обобщен как отработка под-последовательности. И не 4-8 а можно и больше. Главное чтоб partitions были крупные. ИМХО это продолжение темы сортировки, т.е. сортировка склееных сортированных последовательностей. Но тема тупиковая, надо по другому решать: индексы, просто выносить порядок сортировки в отдельный файл, там могут быть просто указатели (смешения) на начала строк исходного биг-файла. Я с DBF много работал, там никто не заморачивается физической сортировкой, только индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 20:45 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
На правах топик-стартера я все таки настаиваю на том что в данном топике мы все таки создадим это решение. Индексирование и базы данных - это все-таки отдельная тема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 20:53 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonВ последнее время до меня долетает великий плач и стенания со стороны junior-девелоперов о том что то тут, то там они были завалены на собеседованиях вопросом о сортировке толстых текстовых файлов. Правильный ответ: "Зачем надо сортировать?" Пусть спрашивающий опишет всю глубину жопы родившей этот файл, а отвечающий подумает надо ли ему работу в этой жопе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 20:59 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
ЕМНИП это был вопрос из Microsoft-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:01 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
mayton д0kХпропущено... Окей :) Я предлагаю прокатиться на велоОЛАПе и собрать гистограмную статистику. Какие будут варианты ? Предлагаю получить распределение селективности внутри строки. Для случая когда 90% строк в файле имею одинаковый префикс. Добавлю. На 1-м проходе мы можем 1) Сделать общий подсчет строк (N). 2) Используя хеш таблички, контрольные суммы или карту блума сделать count distinct. Здесь я сделаю оговорку что нам не нужен точный подсчет. Можно даже сделать estimation. Пускай это называется (M). 3) Если соотношение M/N близко к 1 - то делаем вывод что строки уникальны и упрощаем алгоритм. Если M/N близко к 0 то делаем вывод что дублей много и форсируем дедупликацию в алгоритме merge. 4) Префиксы. Мне здесь на ум приходит дерево trie и его различные модификации. Здесь я ставлю TODO: research на исследование как префиксное дерево поможет прижать текстовый файл. В некотором гипотетическом варианте если на 1-м проходе данные будут иметь благоприятный расклад - то мы уже получили сортировку деревом и алгоритм закончен. Если мы вываливаемся по OutOfMemory - то надо проанализировать полезную инфу которая пришли из trie и заюзать ее в алгоритме. В этом-же пункте можно развернуть строки в "обратку" и посмотреть суффиксы. 5) Есть смешной (гипотетический вариант) когда на вход нам подали apache или jboss логи и они де-факто уже сортированы (по timestamp) и нам остается просто правильно принять решение о том что сортировка вообще не нужна. Понятно что это нивелирует разработку но согласитесь такой кейс тоже надо рассмотреть. Предлагаю Step-by-step. Предположу, что у нас есть 3-и шага: 1. Сортировка РАЗлиянием. Разделение файла на N-частей. На данном этапе мы уже можем проводить сортировку (например по первой букве, префексу). 2. Сортировка/досортировка получившихся отдельных частей 3. Сортировка слиянием Есть следующие базовые параметры алгоритма 1. Кол-во частей которые одновременно сливаем/разливаем. В случае классического HDD или магнитной ленты (Кнут) - ограничено кол-вом устройств 2. Эффективный размер буфера для ввода/вывода с устройства. Пункт 1 * 2 желательно должно помещаться в ОП 3. Максимальный размер одного атомарного файла Желательно должен помещаться в ОП 4. "Стоимость" CPU vs IO. Например, в момент записи временного файла его можно сжимать (даже банальным LZW). Экономим IO, тратим CPU/RAM. Вариант с "префиксами" мне кажется наиболее интересен в реальной жизни. Хотя... фиг знает... когда это реально критично. IMHO Вполне можно на дереве найти такую функцию, что если x < y то и f(x) < f(y) Т.е., если у нас все уникальный строки/префиксы помещаются в обычное binary tree и в RAM, то вполне можно кодировать строки их путем по дереву, это дает следующий профит: 1. Префик на дереве будет определять в какой временный файл мы пишем данные при "разлиянии". Т.е. сортировка произойдет уже на данном этапе. (а надо ли?) 2. Сортировать можно прямо "сжатые" данные. 3. Собственно компрессия, т.е. удаление дублей Но это хорошо, если у нас есть отдельный проход для построения дерева. Но хочется обойтись без такого прохода, а некий алгоритм который позволит онлайн и строить дерево и выполнять "разлияние". При этом, не портя уже построенные данные. А как этого добиться - мне не очень понятно. Т.е. помесь: стандартного binary tree (отсортированность) Хафмана (путь по дереву короче для часто встречающихся префиксов/строк) Возможность построения онлайн, без порчи пред. данных и без вырождения (в случае если исходная последовательность уже отсортирована) Но вот над чем я думаю... Технически, мы можем передвинуть работу с последнего шага на первый. Но нужно ли? Для одного устройства - скорее всего нет. Мы сокращаем параллельные чтения, но за счет параллельной записи ((( А что HDD, что SDD обеспечивают перформанс по чтению лучше, чем по записи. Для большого кол-ва накопителей - на каком шаге у нас будет возникать параллелизм, фиолетово. Выигрыша и тут не будет. Единственный выигрыш - возможная компрессия. Но если диски сильно медленнее CPU, то тогда достаточно жать временные файлы максимального эффективными алгоритмами (a la LZW) и нафиг какой-то свой самопал. В общем.... практический смысл и возможность использования в мирных целях ... от меня ускользает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:06 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Dima TНо тема тупиковая, надо по другому решать: индексы, просто выносить порядок сортировки в отдельный файл, там могут быть просто указатели (смешения) на начала строк исходного биг-файла. Я с DBF много работал, там никто не заморачивается физической сортировкой, только индексы. Для Subj (СОРТИРОВКА huge файл) и устройств с последовательным/рядом последовательным доступом (диски) - это тупик. Вариант 300 Mb - когда все влезает в RAM, даже не интересно. Отсортировать хоть банальным пузырьком и не париться ))). IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:10 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
mayton, обычно ещё есть ограничение на использование рам, н-р 1 Мб делал такую задачку так (в принципе, классическая схема): читал блоками по установленному лимиту сортировал блок (QSort) и сохранял в файл дальше над блоками обычная сортировка слияниями(объединение равноценных блоков) делал сначал на fpc под Linux Min 16, ext4, i7 4710HQ, ноут тот же код под Windows на NTFS работал раза в 3-4 медленнее под linux диск был под завязку занят даже при однопоточной модели, собственно всё упёрлось в производительность диска под Windows диск был более менее доступен, я так понимаю он на каждый IO забирал время у текущей задачи, что и привело к деградации производительности на всякий случай попробовал с потоками, ускорение было только под Windows и то незначительно - Linux всё равно догнать не удалось из маргинальных вариантов: предварительную разивку делать по первой букве делать предварительную разбивку по сортированным кускам (достаточно проверять предыдущую строку) на аморфной массе в 10 гб все эти способы фактически проваливаются, первый из-за деградации IO, второй - тупо таких внушительных блоков нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:17 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev1. Сортировка РАЗлиянием. Разделение файла на N-частей. На данном этапе мы уже можем проводить сортировку (например по первой букве, префексу). 2. Сортировка/досортировка получившихся отдельных частей 3. Сортировка слиянием Нужно делить не на N частей а на partitions по размеру близкие к тому что выдает утилита free. Сортировать каждый parition отдельно quick-sort и сохранять его как файл на диск. Здесь-же можно провести дедупликацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:18 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)делал такую задачку так (в принципе, классическая схема): читал блоками по установленному лимиту сортировал блок (QSort) и сохранял в файл дальше над блоками обычная сортировка слияниями(объединение равноценных блоков) В 2003-м я делал это на C# с XML документами. Но постановка была посложнее т.к сложно было оценить сколько XML-records загонять в 1 блок и сервер периодически падал. А XMLReader не обладал API для подсчета символов. Вобщем делал partitions на глаз. По количеству тегов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:23 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
maytonНа правах топик-стартера я все таки настаиваю на том что в данном топике мы все таки создадим это решение. Я бы все таки определился, что такое "текстовый". И что такое "строка" Т.к. предыдущий похожий топик предполагал, что может быть и строка размером в гигабайты... а тогда говорить о префиксах, деревьях совершенно мозги вскипают. Предлагаю понятие строка, в ТЗ хотя бы 256 или пусть даже 1024 символами ограничить. А то ТЗ, совершенно не ТЗ ))) maytonDima T\/ это смерживатели В моей терминологии это triplet. Тройка. Потому-что две вершины - это как-бы каналы чтения. И одна вершина - это канал записи. Почему две вершины? Насколько я помню Кнута (читал лет 25 назад!), кол-во каналов чтения предлагалось выбирать по кол-ву устройств. Если брать современных SDD / HDD, то грубо говоря, кол-во RAM / размер буфера выделенного для последовательного много блочного чтения/записи. Предположим, что у нас huge файл 1 Tb и 1 Gb RAM. Буфер IO пусть 64 Mb, тогда одновременно сливаем до 16 файлов. Первый проход по диску (разлияние + сортировка) - чтение 1 Tb и запись 1024 отсортированных частей Второй проход 1024 / 16 = 64 Третий проход 64 / 16 = 4 Четвертый проход - завершили обработку Т.е. IO 4 Tb чтения, 4 Tb записи. В случае triplet, нужно было бы 10-11 проходов. Все же, современные HDD (а тем более SSD), это не магнитные ленты. Подозреваю, что для SSD можно было бы и буфером < 1 Mb обойтись и все выполнить в 2 прохода. Разлияние + сортировка, слияние в один проход из 1024 файлов одновременно. Т.е., есть подозрение, что для SSD и улучшать особо нечего, да и не нужно. Чисто теоретически. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:29 |
|
||
|
Тяпничная huge-сортировка
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВариант с "префиксами" мне кажется наиболее интересен в реальной жизни. Хотя... фиг знает... когда это реально критично. IMHO Вполне можно на дереве найти такую функцию, что если x < y то и f(x) < f(y) Т.е., если у нас все уникальный строки/префиксы помещаются в обычное binary tree и в RAM, то вполне можно кодировать строки их путем по дереву, это дает следующий профит: 1. Префик на дереве будет определять в какой временный файл мы пишем данные при "разлиянии". Т.е. сортировка произойдет уже на данном этапе. (а надо ли?) 2. Сортировать можно прямо "сжатые" данные. 3. Собственно компрессия, т.е. удаление дублей Давай бинарное или красно-черное или АВЛ сразу выбросим в топку. Они хранят ключи в первичном виде и нем не хватит места. Нам нужно дерево поджимающее ключи. Из таковых я могу вспомнить trie (prefix-tree), radix e.t.c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 21:29 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39417659&tid=1340453]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
89ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 455ms |

| 0 / 0 |
