当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《何时为I/O(C++)构建自己的缓冲系统?》经验,为你挑选了3个好方法。

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

有关如何提高性能的任何想法?

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



1> Roddy..:

2GB的文件非常大,您需要了解可能充当瓶颈的所有可能区域:

硬盘本身

硬盘接口(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秒.

它实际需要多长时间?

嗨Roddy,使用带有1.1 GB文件和大缓冲区(128,255或512 MB)的fstream读取方法,它需要大约43-48秒,并且使用fstream getline(逐行)是相同的.cp需要将近2分钟来复制文件.

在这种情况下,您的硬件绑定.cp必须读写,并且会在疯狂的情况下在磁盘表面上来回寻找.所以它(如你所见)将比简单的'读'案例差两倍多.

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

你还没说过磁盘接口是什么?SATA几乎是最简单/最快的选择.另外(显而易见的是,这......)确保磁盘实际上在您的代码运行的同一台机器上,否则您将受到网络限制......



2> Andreas Magn..:

我还建议使用内存映射文件但是如果你要使用boost我认为boost :: iostreams :: mapped_file是一个比boost :: interprocess更好的匹配.



3> David Pierre..:

也许你应该研究内存映射文件.

在这个库中检查它们:Boost.Interprocess

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有