gpt4 book ai didi

c++ - 何时为 I/O (C++) 构建您自己的缓冲系统?

转载 作者:IT王子 更新时间:2023-10-29 00:38:14 26 4
gpt4 key购买 nike

我必须处理非常大的文本文件(2 GB),必须逐行读取/写入它们。使用 ofstream 写入 2300 万行真的很慢,所以一开始,我试图加快在内存缓冲区(例如 256 MB 或 512 MB)中写入大块行的过程,然后将缓冲区写入文件.这没有用,性能大致相同。我在读取文件时遇到同样的问题。我知道 I/O 操作由 STL I/O 系统缓冲,这也取决于磁盘调度程序策略(由操作系统管理,在我的例子中是 Linux)。

关于如何提高性能有什么想法吗?

PS:我一直在考虑在程序处理数据时使用后台子进程(或线程)来读取/写入数据 block ,但我不知道(主要是在子进程的情况下)这是否会值得。

最佳答案

一个 2GB 的文件相当大,您需要了解所有可能成为瓶颈的区域:

  • 硬盘本身
  • 硬盘接口(interface)(IDE/SATA/RAID/USB?)
  • 操作系统/文件系统
  • C/C++ 库
  • 你的代码

我会先做一些测量:

  • 您的代码读取/写入 2GB 文件需要多长时间,
  • ' dd 能有多快? '命令读取和写入磁盘?示例...

    dd if=/dev/zero bs=1024 count=2000000 of=file_2GB

  • 仅使用大的 fwrite()/fread() 调用写入/读取需要多长时间

假设您的磁盘能够以大约 40Mb/s 的速度读取/写入(这可能是一个实际的数字),您的 2GB 文件的运行速度不会超过大约 50 秒。

实际需要多长时间?

Hi Roddy, using fstream read method with 1.1 GB files and large buffers(128,255 or 512 MB) it takes about 43-48 seconds and it is the same using fstream getline (line by line). cp takes almost 2 minutes to copy the file.

在这种情况下,您将受限于硬件。 cp 必须读取和写入,并且会在执行此操作时疯狂地在磁盘表面来回搜索。所以它(如您所见)将是简单“读取”情况的两倍多。

为了提高速度,我首先尝试的是更快的硬盘驱动器或 SSD。

你还没说磁盘接口(interface)是什么? SATA 几乎是最简单/最快的选择。另外(很明显,这...)确保磁盘物理上位于您的代码运行的同一台机器上,否则您将受网络限制...

关于c++ - 何时为 I/O (C++) 构建您自己的缓冲系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com