【问题标题】:Slow file look up for large directories慢速文件查找大目录
【发布时间】:2013-12-14 03:08:04
【问题描述】:

如果我从有 50 万个文件的目录中创建文件的文件对象,那么查找和打开该文件会很慢吗?如果是,那背后的原因是什么?

【问题讨论】:

    标签: java file-io directory operating-system


    【解决方案1】:

    我在 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
    

    【讨论】:

    • 是的,这很明显,因为 Robin 说它依赖于下划线硬件、操作系统和文件系统。非常感谢@gabor 的努力,现在我知道列出文件的确切复杂性了。但我想知道检查文件是否存在的复杂性。
    • 这看起来很有趣,这就是我的想法。对于随机文件访问,不应该放慢速度。我非常感谢你的工作。
    • 虽然它依赖于底层硬件和文件系统实现,但现代文件系统散列文件名(上面列出的那些),因此查找效率为 O(log N)。另一方面,按字母顺序列出需要排序 O(N * log N)。
    【解决方案2】:

    当您在数万个文件的 order 上有一些东西时,性能通常会开始下降,所以是的,半百万个文件可能会杀死您的计算机 - 这似乎是个坏主意。

    【讨论】:

    • Amir 非常感谢快速 rply,但困扰我的问题是,jvm 在打开文件之前是否会尝试将文件路径与对象匹配到该位置的每个文件?
    • @ShashankShekhar 不,操作系统会进行搜索。所以它取决于操作系统(例如 Windows、Linux、Mac OS X)和文件系统(例如 NTFS、ext4)。
    • @ShashankShekhar,JVM 委托给操作系统。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2017-05-07
    • 2011-12-02
    • 2017-11-15
    • 2015-07-09
    相关资源
    最近更新 更多