Какая структура с лимитом памяти позволит ускорить поиск по огромному файлу с набором бинарных данных?

Имеется 10ГБ файл содержащий отсортированные 500млн записей byte[20].
Задача состоит в поиске индексов записей по префиксу размером byte[x], где x от 1 до 16.

Имеется лимит памяти в 1-2ГБ и времени 5 минут на создание файла-индекса, который будет использован для поиска.
Имеется лимит памяти в <100МБ на вспомогательные структуры при поиске, те не на результат поиска.

Подскажите куда копать и какие структуры использовать (+ желательно примеры).
  • Вопрос задан
  • 220 просмотров
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если записи фиксированного размера и отсортированы, а поиск идёт по префиксу, то никаких дополнительных структур не надо, достаточно двоичного поиска.
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Первое - если файл отсортирован, то поможет бинарный поиск. Самое "в лоб", но возможно не подойдет.

В качестве индекса можно использовать бинарное дерево. Но здесь, я бы сделал так:
- В узлах храним записи фиксированного размера, чтобы не бегать постоянно и дополнительно высчитывать смещения (все 16 байт для хранения использовать можно)
- Само дерево будет содержать отрезки, т.е. не полный готовый ответ. В противном случае, будет нарушено ограничение на размер (10Гб ты никак не перепрыгнешь)

В итоге, путь будет такой:
1. Идешь в индекс ("дерево отрезков") и находишь левую и правую границу
2. Идешь в целевой файл и запускаешь бинарный поиск по нему

Если хранить индекс в памяти, то будет гораздо быстрее. Но высоту дерева надо найти импирически из-за ограничения в 100Мб в памяти
Ответ написан
Комментировать
@alex_ak1
10 гб разбить на файлы по 1 гб, отсортировать их.
Потом бинарным поиском по 10 файлам искать. Если будут добавлятся данные, то это просто файл№ 11 будет и искать данные потом по 11 файлам.
Либо же отсортированные 10 файлов можно слить в 1 большой.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Коробочным решенеим задачи может быть префиксное дерево (Trie) с лимитом в 100Мб
которое в листовых узлах должно хранить списки искомых записей.

Учитывая объемы, списки не влезают. Поэтому можно хранить ссылки на файлы или
на offsets внутри большого файла. Тут уже не теория а эксперимент больше покажут
что подойдет.

Мы также исходим из некого оптимистичного предположения что данные - это все таки
не рандомный шум а какие-то тексты, что позволит делать дерево максимально компактным.
(Чтоб каждый узел не содержал 1 байт а хотя-б цепочку букв).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы