Найти дубликаты строк в большом файле - PullRequest
6 голосов
/ 09 октября 2010

Файл содержит большое количество (например, 10 миллиардов) строк, и вам нужно найти повторяющиеся строки. У вас есть N доступных систем. Как вы найдете дубликаты

Ответы [ 2 ]

8 голосов
/ 09 октября 2010

Ответ Эриксона, вероятно, ожидаемый тем, кто задает этот вопрос.

Вы можете использовать каждую из N машин в качестве корзины в хеш-таблице:

  • для каждой строки (скажем, строка номер i в последовательности) вычислить хеш-функцию для нее, h.
  • отправить значения i и h на номер машины n для хранения, где n = h% N.
  • с каждого компьютера, получить список всех значений хеш-функции h, для которых было получено более одного индекса, вместе со списком индексов.
  • проверить наборы строк с одинаковыми значениями хеша, чтобы увидеть, действительно ли они равны.

Честно говоря, для 10 миллиардов строк вы могли бы правдоподобно сделать это на 1 ПК. Хеш-таблица может занимать что-то вроде 80-120 ГБ с 32-битным хешем, в зависимости от точной реализации хеш-таблицы. Если вы ищете эффективное решение, вам нужно немного конкретизировать, что вы подразумеваете под «машиной», потому что это зависит от того, сколько памяти у каждого есть, и относительной стоимости сетевого взаимодействия.

5 голосов
/ 09 октября 2010

Разделить файл на N частей. На каждой машине загрузите столько памяти, сколько сможете, и отсортируйте строки. Запишите эти куски в хранилище на этой машине. На каждой машине объедините чанки в один поток, а затем объедините поток с каждой машины в поток, содержащий все строки в отсортированном порядке. Сравните каждую строку с предыдущей. Если они одинаковые, это дубликат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...