P
Path Secure
@pathsecure3.7K подп.
5.6Kпросмотров
1 февраля 2025 г.
📷 ФотоScore: 6.1K
Некоторое время назад взялся за старую задачку из беклога: нужно было объединить словари с паролями. Сложность в том, что размер словарей был большим. 200 гигов и 56 гигов. С большой вероятностью многие строчки будут дублироваться, а значит нужно убирать дубликаты. Я сразу понял, что решать такую задачу влоб (используя стандартные GNU утилиты sort и uniq нельзя). В связи с этим я пообщался с дата-сатанистами и объяснил свою задачу. Мне посоветовали воспользоваться duckdb. Это форк sqlite на rust и это колоночная бд с кучей оптимизаций. Я решил попробовать. Установка очень простая, кажется, я выкачал бинарник на сервер и всё. Кстати, о сервере. Это было достаточно смешно и интересно. У меня было где-то 3-4 итерации. Сперва я закупил виртуалку с 16 ядер и 32 гигов оперативной памяти. Я сразу же упёрся в производительность процессора, а потом в количество оперативной памяти, потому то duckdb буферизирует данные в оперативной памяти для обработки. Далее я увеличил размер оперативной памяти примерно до 60 и процессор до 32 ядер. На второй итерации я упёрся в производительность диска, потому что всё, что не помещается в оперативную память пишется на диск. Спустя несколько итераций я дошел до мегавиртуалки с 500 гигами оперативы и 64 ядрами процессораа, а также супер быстрыми дисками со скоростью 1000 мб/сек. 300 гигов рамы мне не хватало для задачи удаления нечитаемых символов. В целом опыт достаточно забавный. Суммарно на всё ушло две субботы. Чуть больше познакомился с облачными вычислениями. По итогу имеется большой словарь, представляющий собой компиляцию из других словарей. Суммарный объем выше даже меньше, чем я предполагал, примерно 180 гигов. Всё веселье вышло примерно в 5к рублей. В целом совсем не много для исследовательского проекта в рамках бизнес задачи. Думаю, что всё можно было сделать суммарно часа за 2, если сразу взять большую виртуалку и загрузить словари в облачное хранилище, а также копировать и вставлять готовые команды. А как вы решаете такие задачи? Поделитесь в комментариях! Ниже полезные команды, которые мне понадобились для выполнения этой задачи: Расширяем лимит для записи на диск, иначе загрузка может внезапно обрубиться: PRAGMA max_temp_directory_size='200GiB' Задаем число потоков для одновременной обработки: PRAGMA threads = 32 Указывает максимальный объём оперативной памяти для использования: PRAGMA memory_limit = '244GB'; Создание таблицы из файла без заголовка: CREATE TABLE "merged_passwords" as select from read_csv_auto('rockyou2021.txt', header=false, columns={'password':'TEXT'}, ignore_errors=true); Чтение файла и загрузка его в таблицу: insert into merged_passwords SELECT DISTINCT from read_csv_auto('bigfile.txt', header=false, ignore_errors=True); Также можно вычищать пустые сиволы из строк по регулярке: update merged_passwords set password = regexp_replace(password, '&#092;00', ' ','g') Удалить строки короче 8 символов DELETE FROM merged WHERE LENGTH(password) < 8; Выгрузка базы в текстовый файл: COPY merged_passwords to 'merged.txt' (HEADER FALSE); #rnd #wordlists #duckdb
5.6K
просмотров
3168
символов
Нет
эмодзи
Да
медиа

Другие посты @pathsecure

Все посты канала →