2011-05-22 4 views
2

У меня проблема с алгоритмом. Вы, ребята, поможете мне здесь?Удалить дубликаты данных в файле

У меня есть файл, который огромен и, следовательно, не может быть загружен сразу. Существует повторяющиеся данные (общие данные, могут быть строками). Мне нужно удалить дубликаты.

+0

Необходимо сохранить порядок данных в файле? –

+0

Насколько велик файл? – Pushkar

+0

Да, данные необходимо сохранить. –

ответ

2

Одно легкое, но медленное решение читается 1-го гигабита в HashSet. Прочтите последовательный остаток файла и удалите дублированные строки, которые находятся в файле. Затем прочитайте 2-й гигабайт в памяти (hashset) и удалите дубликаты файлов и снова, и снова ... Его довольно легко запрограммировать, и если вы хотите сделать это только один раз, этого может быть достаточно.

+0

Хорошее предложение. После чтения фрагмента записей (1 ГБ или любого другого размера) вам нужно только отсканировать его вперед. Если записи не могут быть удалены на месте, сделайте это как ряд копий файлов. Не забудьте просканировать дубликаты в каждом фрагменте, прежде чем сканировать остальную часть файла! –

+0

Заказ HashSet. Но первоначальный порядок утерян, не так ли? LinkedHashSet - это решение. –

+0

HashSet «заказывается» в соответствии с хешем. Исходный порядок утерян. = вы должны прочитать n-й гигабит в памяти, а затем прочитать весь файл и удалить дубликаты. –

0

Второе решение:

  1. Создать новый файл, в котором вы пишете пары < String, Позиция в исходном файле>
  2. Чем вы будете использовать классическую сортировку для больших файлов в соответствии с String (сортировка больших файлов = Сортируйте мелкие части файла в памяти, а затем объедините их вместе) - во время этого вы удалите дубликаты
  3. И чем перестроить исходный заказ = вы будете сортировать его снова, но в соответствии с «Позиция в исходном файле»
1

вы можете вычислить хэш для каждой записи и держать, что в карте>

чтения в файле построение карты и, если вы найдете HashKey существует на карте вы ищете для размещения двойной проверки (если не равное добавьте местоположение в отображаемый набор)

+0

Да, это звучит хорошо. Если у вас достаточно памяти для всех хэшей, это будет простое и хорошее решение. –

+0

фактически хэш может быть ограничен произвольно (сбалансирован от коллизий), но места могут взорваться (это длинно для каждой уникальной записи) –

0

В зависимости от того, как вход помещается в файл; если каждая строка может быть представлена ​​данными строки;

Другой способ - использовать сервер базы данных, вставить ваши данные в таблицу базы данных с уникальным столбцом значения, читать из файла и вставлять в базу данных. В конце база данных будет содержать все уникальные строки/строки.

Смежные вопросы