Как дедуплицировать 40 ТБ данных?

17

Я унаследовал исследовательский кластер с ~ 40 ТБ данных в трех файловых системах. Данные растянуты почти на 15 лет, и, скорее всего, существует большое количество дубликатов, поскольку исследователи копируют данные друг друга по разным причинам, а затем просто держатся за копии.

Я знаю об инструментах устранения дублирования, таких как fdupes и rmlint. Я пытаюсь найти тот, который будет работать с таким большим набором данных. Мне все равно, потребуются ли недели (или, может быть, даже месяцы) для сканирования всех данных - я, вероятно, в любом случае ограничу их, чтобы облегчить работу с файловыми системами. Но мне нужно найти инструмент, который либо как-то очень эффективен с оперативной памятью, либо может хранить все промежуточные данные, которые ему нужны, в файлах, а не в оперативной памяти. Я предполагаю, что моя оперативная память (64 ГБ) будет исчерпана, если я просканирую все эти данные как один набор.

Сейчас я экспериментирую с fdupes на дереве объемом 900 ГБ. Проходит 25%, а использование ОЗУ все время медленно растет, теперь оно составляет 700 МБ.

Или есть ли способ направить процесс на использование ОЗУ с отображением на диске, чтобы было гораздо больше доступного и не использовать системную ОЗУ?

Я использую CentOS 6.

Майкл Штауффер
источник
Файловые системы XFS, на случай, если это уместно. То есть я знаю, что это не фс с возможностями дедупликации, как XFS.
Майкл Штауффер
почему вы беспокоитесь о оперативной памяти в первую очередь? Операционная система имеет свои собственные алгоритмы управления памятью, и тот факт, что использование оперативной памяти «нарастает», не означает, что она в конечном итоге поглотит всю вашу оперативную память. Я уверен, что этого не произойдет.
Арт Гертнер
1
Я не знаю, как работают специальные инструменты, но вы можете рассчитать хеш для каждого файла и записать его вместе с путем к файлу, а затем отсортировать по хешам и дедуплицировать. Это должно быть выполнимо с помощью простого скрипта Python или, возможно, даже в Bash. Использование оперативной памяти должно быть минимальным, за исключением этапа сортировки, но я полагаю, вы могли бы использовать какую-то модифицированную сортировку слиянием, чтобы она оставалась достаточно низкой.
Гроностай
1
Да, специализированный инструмент вычисляет хеш, но сначала делайте такие вещи, как просмотр размера файла, и хэшируйте только начало файлов, чтобы ограничить количество полных хешей, которые нужно вычислять.
Майкл Штауффер
Что касается оперативной памяти, меня беспокоило замедление работы файлового сервера - см. Мой комментарий ниже к ответу.
Майкл Штауффер

Ответы:

4

Или есть ли способ направить процесс на использование ОЗУ с отображением на диске, чтобы было гораздо больше доступного и не использовать системную ОЗУ?

Да, это называется диск подкачки. Вы, вероятно, уже есть. Если вы беспокоитесь о нехватке ОЗУ, тогда стоит начать с увеличения. Он работает автоматически, поэтому нет необходимости делать что-то особенное.

Я не буду беспокоиться о Fdupes. Попробуйте, это должно работать без проблем.

krowe
источник
Я думал, что использование swap замедлит работу всей системы - это занятый файловый сервер. Но, может быть, недостаточно беспокоиться? Я мог бы использовать ulimit, чтобы предотвратить использование процесса больше, чем системный ram в любом случае, как я полагаю, как отказоустойчивый. Но кажется, что krowe и smc не думают, что fdupes все равно будет использовать столько оперативной памяти, поэтому я должен просто попробовать.
Майкл Штауффер
1

поиск дубликатов на основе хэш-ключа работает хорошо и очень быстро.

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
Кумар
источник
0

Напишите быстрое приложение для обхода деревьев, либо нажав (hash, mtime) => filepath в словарь, либо отметив файл для удаления, если запись уже существует. Хеш будет просто MD5, рассчитанным на первые N байтов. Вы можете сделать несколько разных проходов, с хешем над малым N и затем другим с хешем над большим N.

Вы могли бы сделать это менее чем за двадцать или тридцать строк Python (используя os.walk ()).

Дастин Опря
источник