代码之家  ›  专栏  ›  技术社区  ›  Avinash

C++中的文件读取

c++
  •  0
  • Avinash  · 技术社区  · 16 年前

    我正在编写应用程序来监视一个文件,然后匹配该文件中的某个模式。 我想知道什么是最快的方式读取一个文件在C++中 正在逐行读取的文件块的读取速度更快。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Thomas Matthews    16 年前

    一般来说,将大量文件读取到缓冲区中,然后解析缓冲区要比读取单个行快得多。实际的证明是逐行分析读取代码的代码,然后在大型缓冲区中分析读取代码。比较配置文件。

    这个理由的基础是:

    • 减少I/O事务
    • 保持硬盘旋转
    • 解析内存更快

    通过应用这些技术,我将一个应用程序的性能从65分钟提高到了2分钟。

    减少I/O事务
    减少I/O事务会导致很少调用操作系统,从而缩短了操作系统的时间。减少代码中的分支数;提高处理器中指令管道的性能。同时也减少了硬盘的流量。硬盘上处理的命令更少,因此开销也更少。

    保持硬盘旋转 要访问一个文件,硬盘必须将电机加速到合适的速度(这需要时间),将磁头定位到所需的磁道和扇区,并读取数据。定位磁头和升高电机是所有事务所需的开销时间。读取数据的开销很小。目标是在一个事务中读取尽可能多的数据,因为这是硬盘最有效的地方。减少事务数将减少增加电机和定位磁头的等待时间。

    尽管现代计算机有数据和命令缓存,但减少数量会加快速度。更大的“有效负载”将允许更有效地使用它们的缓存,而不需要对请求进行排序的开销。

    解析内存更快
    从内存读取总是比从外部源读取快。从缓冲区读取第二行文本需要增加指针。从文件中读取第二行需要I/O事务才能将数据存入内存。如果你的程序有空闲的内存,把数据拖到内存中,然后搜索内存。

    数据太多会降低性能
    计算机上有有限数量的RAM供应用程序共享。访问超过此内存的内存可能会导致计算机“翻页”或将请求转发到硬盘驱动器(称为 虚拟存储器 )在这种情况下,由于硬盘驱动器是以任何方式访问的(由操作系统访问,而程序不知道),因此节省的成本可能很少。分析可以很好地指示数据缓冲区的最佳大小。

    我优化的应用程序正在从一个2GB文件中一次读取一个字节。当我将程序更改为读取1 MB的数据块时,性能大大提高。这也允许在循环展开的情况下增加性能。

    希望这有帮助。

        2
  •  6
  •   Skizz    16 年前

    您的问题更多地是关于硬件、操作系统和运行时库的性能,而不是与编程语言有关。当您开始读取一个文件时,操作系统可能正在以块的形式加载文件,因为文件是以这种方式存储在磁盘上的,所以操作系统在第一次访问时完全加载每个块并对其进行缓存,而不是读取块,提取请求的数据并丢弃其余部分是有意义的。

    哪个更快?一次一行还是一块?像往常一样,答案并不是你能预测到的,唯一能确定的方法就是逐行编写一个版本和一次一个块的版本,并对它们进行分析(测量每个版本需要多长时间)。

        3
  •  2
  •   Patrick    16 年前

    您可以尝试使用内存映射文件直接将文件映射到内存,然后使用标准C++逻辑来查找所需的模式。

        4
  •  1
  •   Jorg B Jorge    16 年前

    OS(甚至你使用的C++类)可能在块中读取文件并缓存它,即使你逐行读取,以提高最小化磁盘访问的性能(从操作系统的角度来看,它将比从硬盘设备读取内存缓冲区的数据更快)。

    请注意,提高程序性能的一个好方法(如果它确实是时间关键的话)是最小化对操作系统功能(管理其资源)的调用数量。