Файл - это просто оболочка для пути к файлу.Неважно, насколько большой файл - это только его имя.
Когда вы хотите получить размер всех файлов в каталоге, ОС должна прочитать каталог, а затем найти каждый файл, чтобы получить его.его размер.Каждый доступ занимает около 10 мс (потому что это типичное время поиска для жесткого диска). Поэтому, если у вас есть 100 000 файлов, вам потребуется около 17 минут, чтобы получить все их размеры.
Единственный способ ускорить эточтобы получить более быстрый диск.например, для твердотельных накопителей среднее время поиска составляет 0,1 мс, но для получения размера файлов размером 100 КБ все равно потребуется 10 секунд или более.
Кстати: размер каждого файла не имеет значения, поскольку он нена самом деле читать файл.Только запись файла, которая имеет его размер.
РЕДАКТИРОВАТЬ: Например, если я пытаюсь получить размеры большого каталога.Сначала это происходит медленно, но гораздо быстрее, когда данные кэшируются.
$ time du -s /usr
2911000 /usr
real 0m33.532s
user 0m0.880s
sys 0m5.190s
$ time du -s /usr
2911000 /usr
real 0m1.181s
user 0m0.300s
sys 0m0.840s
$ find /usr | wc -l
259934
Причина, по которой поиск выполняется так быстро, что в первый раз все файлы были установлены сразу, и большая часть информации доступнапостоянно на диске.Когда информация находится в памяти, считывание информации о файле занимает совсем немного времени.
Время FileUtils.sizeOfDirectory ("/ usr") занимает менее 8,7 секунд.Это относительно медленно по сравнению со временем, которое требуется для du, но оно обрабатывает около 30 КБ файлов в секунду.
Альтернативой может быть запуск Runtime.exec("du -s "+directory);
, однако это будет иметь значение только в несколько секунд.Большая часть времени, вероятно, будет потрачена на ожидание диска, если он не находится в кеше.