从Linux文件系统读取文件的时间复杂度是多少?

时间:2014-12-18 17:49:38

标签: java linux filesystems

假设我的文件系统中有非常多的目录(比如100.000),并且每个目录中都有相似数量的目录。每个目录可以包含任意数量的文件,但通常不会超过几个。这种结构变为恒定深度(10)。

我的问题是,如果我从这个目录结构中读取文件,例如:/dir-34/dir-215/dir-345/file1使用Paths.get()与读取文件形式相比,那么时间复杂度(在阅读操作中)是否存在差异像这样的简单文件系统:

/dir1
  /dir2
  /dir3
    file1
  /dir4
    file2

注意:这只是一个理论问题我只想知道我尝试打开文件的目录中的目录/文件数是否对读取操作的速度有任何影响

2 个答案:

答案 0 :(得分:2)

一些流行的文件系统使用比旧文件系统更高效的数据结构。 ext4默认情况下启用了目录哈希(如@ninjalj所指出的),XFS也是如此。这意味着单个目录中的查找平均需要O(1)(如果您的路径具有固定的最大子目录数,则为常量时间)。这遵循performance of the hash function itself.

即使每个目录中有数以万计的文件,访问单个文件的速度也非常快 - 但前提是您拥有完整路径。如果您没有完整路径,而是必须查看模式的目录,那么您将面临目录中条目数的O(n)。对于默认系统级目录读取调用的小读取大小(32k),这进一步加剧了这种情况。

(虽然ext4目录可以包含大量文件,但它们仅限于64000个子目录条目。)

答案 1 :(得分:1)

如果/path/to/file可用,(注意:性能和时间复杂度仍然主要取决于磁盘结构和底层文件系统实现。例如,btrfs,一切都是b-tree,ext4和XFS使用H树)

因此,为了遍历目录结构直到叶节点(包含该文件的目录),平均情况时间复杂度应为O(logN),而最坏情况应为O(N),N = no中的目录树。最糟糕的情况是,在N-1下创建第N个目录,在N-2中创建第N-1个目录,依此类推......直到根目录,在树中形成一个分支。理想情况下,如果您具有完整路径,则不必遍历树中的所有目录。

然后,如果底层FS支持目录索引和散列,则每次查找都需要另一个O(1)来查找目录中的文件。因此,O(logN)+ O(1),即忽略低阶项,它应该只有O(logN),其中N是水平。