Задача из реальной жизни:
Есть массив uint64_t F[N]
на 17GB, где N ~= 10^9. Лежит на диске, можно mmap-ить.
Есть условно случайная перестановка элементов этого массива, т.е. последовательность indices
из N различных чисел 1..N
.
Перестановка определяется неявно умной хеш-функцией (MPHF), т.е. (условно) не хранится в памяти, а вычисляется как indices(i) = MPHF(F[i])
.
Собственно требуется переставить элементы F по этой перестановке, но:
- Используя до 10GB памяти, лучше меньше (ограничение AWS Lambda),
- Не насилуя диск мелкими рандомными IOPS шириной 8 байт.
Очевидно, можно, условно, разделить 17GB на блоки по 1GB, формируя F’ в 17 проходов. 1GB в памяти, писать в обход кеша, всё что мимо блока – отбрасываем. Тут тоже вопрос – как бы сгруппировать записи, чтобы писать не по 8 байт в рандомной позиции, а по 64 (кеш линию).
Но чуйка подсказыает, что для такой простой задачи должен быть 10 раз исследован оптимальный классический подход в базах данных. Гугл что-то молчит.