Задать вопрос

Как максимально быстро удалить дубли в большом (350Гб) файле?

Каким способом можно максимально быстро удалить дубли в большом (350Гб) файле (~10 миллиардов записей, строк длинной до 255 символов). Какие инструменты для этого лучше использовать (и как их тюнить под эту задачу)? Поделитесь реальным опытом, если у кого таковой имеется?

З.Ы. Intel Core i5-3550, 8Гб RAM
  • Вопрос задан
  • 273 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
Быстро никак не получится

Готовое
sort \
--unique \
--parallel <threads count> -T /path/to/temp/dir/ /path/to/huge/file >>/out/file


Поставь на удаленной машине субд с ram 16gb
Сделайтам таблицу с уникальным полем
И долби своей машины вставками
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
Используйте последовательный проход с фильтрацией с помощью фильтра Блума.
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Хороший вопрос!
На третий взгляд, я бы поступил по следующему алгоритму.

Взял бы базу данных, ну например mysql.... Для хранения кешей и коллизий.
Итак, нам нужно пройтись по записям бигфайла, и сформировать новый бигфайл.
1) берем строчку файла, считаем от нее (или какой-то части), например sha1.
2) ищем по базе данных наш sha1
(таблица в "hashes" c полями "hash" и "offset", "count")
2.1) Если не нашли:
  • копируем текущую строку в новый файл
  • заносим наш sha1 и начало строки в базу (это нужно для коллизий)

2.2) Если нашли:
  • из базы забираем смещение начала строки
  • из старого файла вытягиваем всю строку по смещению и сравниваем
  • если строки равны, то переходим на п1) (можно еще и обновить count этой записи)
  • если строки не равны, у нас коллизия (!), обрабатываем ее


3) Обработка коллизии
(таблица в "collisions" c полями "hash" и "offset", "count")
  • берем из collisions все записи по нашему хешу
  • для каждой записи вынимаем строку из старого файла и сравниваем
  • если строки равны, то переходим на п1) (можно еще и обновить count этой записи)
  • если строки не равны, добавляем новую запись в таблицу collisions с новым смещением, текущюю строку пишем в новый файл



В принципе, этот процесс можно параллелить на бесконечное количество процессов. хотя, нужно бы еще над этим подумать.

PS. Можно еще дополнительное поле в каждой из таблиц сделать "count", обновлять его, если произошло сравнение записей, для статистики.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
Synapse AI Москва
от 120 000 ₽
ITK academy Нижний Новгород
от 75 000 до 120 000 ₽
от 180 000 до 250 000 ₽