Читайте файл потоково, отбирайте совпадения и используйте внешнюю сортировку с удалением дублей. Все 50 ГБ и множество уникальных строк нельзя одновременно загружать в 2 ГБ RAM.
Есть файл размером 50 ГБ и 2 ГБ оперативной памяти. Как найти все строки с определённым паттерном и вывести только уникальные, отсортированные строки, не уронив систему?
Читайте файл потоково, отбирайте совпадения и используйте внешнюю сортировку с удалением дублей. Все 50 ГБ и множество уникальных строк нельзя одновременно загружать в 2 ГБ RAM.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Читайте файл потоково, отбирайте совпадения и используйте внешнюю сортировку с удалением дублей. Все 50 ГБ и множество уникальных строк нельзя одновременно загружать в 2 ГБ RAM.
Для обычных текстовых строк и буквального паттерна пример GNU-инструментов:
set -o pipefail
LC_ALL=C grep -F -- 'pattern' input.txt |
LC_ALL=C sort -u -S 256M --parallel=1 > unique-sorted.txt
sort создаёт временные отсортированные части и сливает их. Нужен достаточный свободный диск; -S задаёт основной буфер, а не жёсткий предел всей памяти процесса. LC_ALL=C выбирает побайтовый порядок. Для регулярного выражения нужен другой режим grep. Если одна строка сама превышает RAM, стандартные построчные инструменты требуют отдельного решения с ограничением длины или дисковым представлением.