Я работал над некоторой дедупликацией данных, которая заставила меня использовать файловую систему в качестве хеш-таблицы. Это привело к тому, что некоторые каталоги были удалены буквально часами, используя практически любой разумный метод (например, rm -rf
, ls -f1 | xargs rm
, find -delete
и т.д.)
В файловых системах Ext2/3/4 каталог - это файл, содержащий хэш-таблицу от имен файлов до номеров инодов (в моем случае, около 60 МБ!) Как я понимаю, запуск rm -rf
и friends выполняется медленно, потому что он следует этой методологии:
Выполните итерацию по хеш-таблице в файле каталога. Для каждой пары имя файла-inode встречается атомарно:
- Уменьшить счетчик имен в индоде.
- Удалить запись из хеш-таблицы.
(Удаление файлов / инодов происходит, когда их количество имен достигает 0, и нет программ с открытыми файловыми дескрипторами, которые указывают на эти иноды.)
Уменьшение количества имен в inode происходит быстро.
Удаление файла (особенно небольшого) также выполняется быстро: в таблице доступности можно просто указать, что диск блокирует принадлежащий файл как свободный.
Замедление, как я могу сказать, возникает в результате удаления записей из хеш-таблицы. У каждого удаления, вероятно, есть шанс вызвать повторное хеширование, поскольку я заметил, что размер файла каталога уменьшается по мере удаления файлов.
То, что я спрашиваю, имеет два аспекта:
- Верны ли мои рассуждения, поскольку это манипулирование хэш-таблицами, которое замедляет процесс?
Если это так, есть ли инструмент, который делает следующее (и, таким образом, вероятно, намного быстрее?)
- Уменьшите количество имен для каждого индекса, указанного в файле каталога.
- Удалить все содержимое всего каталога за один раз.