【问题标题】:how much time for opening a file? [closed]打开文件需要多少时间? [关闭]
【发布时间】:2014-05-02 23:39:40
【问题描述】:

在我的程序中,我使用的是 file.open(path_to_file); .

在服务器端,我有一个包含大量文件的目录,我担心如果目录越来越大,程序运行时间会更长,因为file.open();

    //code:
    ofstream file;
    file.open("/mnt/srv/links/154");//154 is the link id and in directory /mnt/srv/links i have plenty of files
    //write to file
    file.close();

问题: file.open() 的执行时间会根据目录中文件的数量而变化吗?

我使用的是 debian,而且我相信我的文件系统是 ext3。

【问题讨论】:

  • 这取决于文件系统而不是语言,但总的来说:是的,但通常不足以让任何人关心。
  • 我不得不说,目录中的文件数大约是900000个文件,仍然没有问题?
  • 取决于文件系统。你用的是什么文件系统?对于 FAT32,您可能会遇到问题。 Microsoft 将“300,000 或更多”称为 NTFS 的大量文件,并建议禁用短名称生成以提高性能,还表示 NTFS 使用 BTrees 而不是 FAT32 的缓慢扁平结构:technet.microsoft.com/en-us/library/cc781134(WS.10).aspx
  • 这不是一个真正的 C++ 问题。
  • 我使用的是 linux (debian),我相信我的文件系统是 ext3

标签: file file-io operating-system


【解决方案1】:

我将尝试回答这个问题 - 但是,它相当困难,因为它取决于例如:

  1. 使用什么文件系统 - 在某些文件系统中,目录由未排序的文件列表组成,在这种情况下,找到特定文件的时间是 O(n) - 所以对于 900000 个文件,它会是一个要搜索的长列表。另一方面,其他一些使用哈希算法或排序列表,分别允许 O(1) 和 O(log2(n)) - 当然,必须单独找到目录的每个部分。对于 900k,O(n) 比 O(1) 慢 900000 倍,而 900k 的 O(log2(n)) 刚好低于 20,因此“快”了 18000 倍。但是,对于 900k 文件,即使是二分查找也可能需要一些操作,因为如果我们将每个目录条目的大小设为 100 字节 [1],那么我们谈论的是 85MB 的目录数据。因此,即使我们只接触 19 或 20 个不同的地方,也需要读取几个扇区。

  2. 文件本身的位置 - 当我在英国时,位于我自己硬盘上的文件比我在德克萨斯州奥斯汀同事的文件服务器上的文件要快得多。

  3. 所涉及的任何文件服务器和通信链接的负载 - 自然,如果我是唯一一个使用合适的 NFS 或 SAMBA 服务器设置的人,它会比使用文件服务器快得多它正在为一个由 2000 台机器组成的集群提供服务,这些机器都在忙于请求文件。

  4. 文件所在系统的内存量和总体内存使用量,和/或本地计算机中的可用内存量。大多数现代操作系统都会在本地有一个文件缓存,如果您使用的是服务器,那么服务器上还有一个文件缓存。更多内存 -> 更多空间来缓存内容 -> 更快访问。特别是,它可以很好地缓存目录结构和内容。

  5. 本地计算机的整体性能。尽管几乎所有上述因素都很重要,但搜索文件的简单努力可能足以对大量文件产生一些影响 - 特别是如果搜索是线性的。

[1] 目录条目至少有:

  • 访问、创建和更新的日期/时间。使用 64 位时间戳,即 24 个字节。
  • 文件大小 - 至少 64 位,因此 8 个字节
  • 对文件所在位置的某种引用 - 至少另外 8 个字节。
  • 文件名 - 可变长度,但可以假设平均为 20 个字节。
  • 访问控制位,至少 6 个字节。

这相当于 66 个字节。但我觉得 100 字节可能更典型。

【讨论】:

    【解决方案2】:

    是的,可以。这完全取决于文件系统,而不是语言。打开/读取/写入/关闭文件的时间都以相应系统调用的时间为主。 C++ 应该会增加相对较少的开销,即使您可以从 C++ 实现中获得惊喜。

    【讨论】:

      【解决方案3】:

      有很多变量可能会影响这个问题的答案,但一般的答案是文件的数量会影响打开文件所花费的时间。

      最大的变量是使用的文件系统。现代文件系统使用目录索引结构(如 B-Trees),以允许搜索已知文件是一种相对快速的操作。另一方面,列出目录中的所有文件或使用通配符搜索子集可能需要更长的时间。

      其他因素包括:

      • 是否需要遍历符号链接来识别文件
      • 文件是本地文件还是网络上的安装程序
      • 缓存

      根据我的经验,使用现代文件系统,单个文件可以在不到一秒的时间内定位到包含成千上万个文件的目录中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 2015-04-26
        • 2014-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多