Медленный поиск файлов для больших каталогов
Если я создаю объект файла из каталога, содержащего полмиллиона файлов, будет ли поиск и открытие этого файла медленным? Если да, то в чем причина этого?
2 ответа
Решение
Производительность обычно начинает ухудшаться, когда у вас есть что-то на order
из десятков тысяч файлов, так что да, полмиллиона файлов, вероятно, убьют ваш компьютер - это кажется плохой идеей.
Я провел некоторые измерения с использованием Java 1.6 в Linux 2.6.32 (избегая шума JIT-компилятора) при открытии файла и списке каталогов. Открытие случайного файла должно быть O(logN) для этого, но нет заметного замедления до 1 миллиона файлов:
Opened random file in /tmp/fubar.100 in 0 ms
Last modified at 1385629306000
Opened random file in /tmp/fubar.1000 in 0 ms
Last modified at 1385631078000
Opened random file in /tmp/fubar.10000 in 0 ms
Last modified at 1385631054000
Opened random file in /tmp/fubar.100000 in 0 ms
Last modified at 1385630478000
Opened random file in /tmp/fubar.1000000 in 0 ms
Last modified at 1385632681000
Похоже, что производительность File.listFiles() равна O (n):
Listed 104 files in /tmp/fubar.100 in 2 ms
Listed 1001 files in /tmp/fubar.1000 in 9 ms (5x)
Listed 10001 files in /tmp/fubar.10000 in 19 ms (2x)
Listed 100006 files in /tmp/fubar.100000 in 186 ms (10x)
Listed 1000002 files in /tmp/fubar.1000000 in 1909 ms (10x)
strace показывает, что getdents () вызывается повторно O (n) раз:
$ grep getdents err.100|wc
28 5006 72926
$ grep getdents err.1000|wc
33 44514 669558
$ grep getdents err.10000|wc
147 441327 6765305
$ grep getdents err.100000|wc
1213 4409107 68693705
$ grep getdents err.1000000|wc
11987 44085454 701243406