1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9

# конспект · шаг 9 из 9

Конспект: внешняя память, кеш и локальность

выжимка - её можно унести в заметки

Понятия

Модель внешней памяти (Аггарвал и Виттер, 1988) - быстрая память размера M, медленная, перенос блоками по B элементов; цена - число переносов. Та же модель - кеш процессора: блок - строка кеша.

Промах - обращение к элементу, чьего блока нет в быстрой памяти; вытесняется давно не нужный блок (LRU).

Прогон - отсортированный кусок на диске. Многопутевое слияние - сразу k ≈ M / B прогонов.

Локальность - загруженная строка используется целиком, пока она в кеше. Кеш-независимый алгоритм - локален без знания M и B.

LSM-дерево - вставки копятся в памяти, сбрасываются прогонами и сливаются в фоне.

Что унести

ЦЕНЫ В БЛОКАХ
проход N / B; случайный доступ ≈ N
1024 элемента, B = 16, 8 блоков в памяти:
    подряд 64, случайно 899, с шагом B - 1024
поиск: двоичный ≈ log₂(N / B), B-дерево ⌈log_B N⌉
    10⁸ ключей, B = 512: 18 блоков против 3
ВНЕШНЯЯ СОРТИРОВКА
прогоны по M: 2N/B; слияние k ≈ M/B − 1 путей: 2N/B за проход
всего 2N/B · (1 + ⌈log_{M/B}(N/M)⌉) - и это нижняя граница
один проход слияния, пока N ≤ M² / B
600 чисел, M = 30, B = 5: 2 пути - 5 проходов, 1440; 5 путей - 2, 720
выбор с замещением: прогоны ≈ 2M на случайных, один - на отсорт.,
    по M - на обратном порядке
КЕШ И ЛОКАЛЬНОСТЬ
массив по строкам: обход по строкам n²/B, по столбцам - до n²
транспонирование блоком t × t: 2t строк кеша должны поместиться
    16 × 16, B = 4, 8 строк: обычно 320, блок 2 - 192,
    блок 4 - 128 (граница 2n²/B), блок 8 - 320, рекурсия - 128
кеш-независимо: делить длинную сторону пополам (Фриго и др., 1999)
умножение блоками: три блока по t · t / B строк кеша
B-ДЕРЕВО ПРОТИВ LSM
B-дерево: вставка - чтение и запись листа, 2 случайных обращения
LSM: элемент переписан ~10 раз, но блоками: 0,208 обращения на вставку
по уровням: мало прогонов, много записи (9,9 раза, 2 прогона)
по ярусам: мало записи, много прогонов (1,9 раза, 15 прогонов)
фильтр Блума: 10 бит на ключ - около 1% ложных срабатываний

Ловушки джокера

Линейный - не значит быстрый. Случайный доступ к N элементам в B раз дороже прохода по ним.

Двоичный поиск по файлу. На диске он читает в шесть раз больше блоков, чем B-дерево.

Слияние по два. Терабайт сортируется за семь проходов вместо двух.

Слишком много путей. Буферы не помещаются в память, и слияние становится случайным доступом.

Циклы не в том порядке. Обход по столбцам массива, лежащего по строкам, - промах на каждое обращение.

Блок, который не помещается. Блок 8 × 8 в кеше на 8 строк не лучше обычного цикла.

B-дерево под потоком случайных вставок. Пропускная способность падает до числа случайных обращений диска в секунду.

LSM без фильтров Блума. Чтение отсутствующего ключа открывает все прогоны.

  • Полувнешний Крускал: внешняя сортировка и скан рёбер, union-find на вершины в RAM; I/O Sort(m)+Scan(m). Filter-Kruskal после лёгкой части отбрасывает тяжёлые рёбра внутри уже связанных компонент.

  • Многофазное слияние трёх файлов распределяет прогоны по соседним числам Фибоначчи, пустой вход становится новым выходом. Недостачу дополняют фиктивными прогонами; число фаз не равно числу полных проходов всех записей.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.