TGViewer
Path Secure Path Secure @pathsecure · 3.68K subscribers
Post #368 5.75K
Некоторое время назад взялся за старую задачку из беклога: нужно было объединить словари с паролями.

Сложность в том, что размер словарей был большим. 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, '\00', ' ','g')

Удалить строки короче 8 символов
DELETE FROM merged WHERE LENGTH(password) < 8;

Выгрузка базы в текстовый файл:
COPY merged_passwords to 'merged.txt' (HEADER FALSE);

#rnd #wordlists #duckdb
  • 🔥 30
  • 👍 7
  • ❤ 2
  • 🤔 1
  • 🤝 1
More from @pathsecure
  1. Aug 27, 2026Хочу поддержать товарищей по направлению комплаенса и методологии": https://t.me/radcop_on…
  2. Aug 26, 2026Вот и закончилось очередное приключение :)) Очень веселый и кайфовый экзамен. Чувствовал с…
  3. Aug 5, 2026Стараюсь не отставать от трендов и качаюсь в направлении ИИшницы. Есть такие мысли, что ст…
  4. Jun 19, 2026Всем привет! Рынок найма сломан, поэтому решили пойти в эксперимент с сарафанным радио в т…
  5. Apr 16, 2026Хей! Пост немного задержался... Но я принес вам Хабр-статью с моей рефлексией по итогам сд…
  6. Mar 19, 2026Всем привет! Сегодня пришло сообщение об успешной сдаче CRTP! Начал решать в середине янва…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →