【发布时间】:2013-12-14 03:08:04
【问题描述】:
如果我从有 50 万个文件的目录中创建文件的文件对象,那么查找和打开该文件会很慢吗?如果是,那背后的原因是什么?
【问题讨论】:
标签: java file-io directory operating-system
如果我从有 50 万个文件的目录中创建文件的文件对象,那么查找和打开该文件会很慢吗?如果是,那背后的原因是什么?
【问题讨论】:
标签: java file-io directory operating-system
我在 Linux 2.6.32 上使用 Java 1.6(避免了 JIT 编译器噪音)对文件打开和目录列表进行了一些测量。每个this 打开一个随机文件应该是 O(logN),但是对于 100 万个文件没有可测量的减速:
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
【讨论】:
当您在数万个文件的 order 上有一些东西时,性能通常会开始下降,所以是的,半百万个文件可能会杀死您的计算机 - 这似乎是个坏主意。
【讨论】: