Простой кеш не сработает. Кеш предназначен для проверки, если у вас уже есть ответ, и только для повторной обработки, если у вас его нет. Но в этом случае одна пропущенная запись сделает другие бесполезными. Так что придется держать все размеры директории обновленного все время.
Также не стоит недооценивать возможное влияние вашего предложения. Назад, когда журналируемые файловые системы были новыми, было много возражений, потому что обновление журнала было слишком дорогим. Кроме того, большинство файловых систем допускают такие опции, как noatime
, nodiratime
и relatime
которые уменьшают эти виды обновления медататы. Обратите внимание, что все они (журналы и обновления времени) связаны во времени, все они получают определенное количество обращений к блокам (и обычно «скрыты» при расширенном планировании ввода-вывода), но обновление размера каждого каталога по пути означает неизвестное количество доступов.
Наконец, в файловых системах POSIX нет реального «содержащего каталог». Запись файла в каталоге указывает на индекс (структуру диска, в которой хранится информация о файле), но нет ссылки от индекса на каталог. Это позволяет использовать функцию «жесткой ссылки», когда несколько записей (обычно в разных каталогах) указывают на один и тот же индекс. Даже если вы сохранили список каталогов, которые указывают на индекс, вы умножаете (уже большое) количество обновлений. Хуже того, теперь вы должны следить за тем, обновили ли вы каждый каталог, поскольку в какой-то момент в цепочке вы получите общего предка, который не должен считаться в два раза больше обновленного. Или это должно? возможно, вам придется сохранить два размера в каждом каталоге, один, который подсчитывает все «реальные» файлы, и другой, который учитывается каждый раз, когда он появляется ....
Это не кажется таким полезным в конце концов.