从一个文件中逐行读取

问题描述:

QTextStream指定为QFile并逐行读取很容易,并且工作正常,但我不知道是否可以通过首先将文件存储在内存中来提高性能,然后逐行处理。从一个文件中逐行读取

从sysinternals中使用FileMon,我遇到过,该文件是以16KB的块读取的,因为我要处理的文件并不那么大(~2MB,但很多!),将它们加载到内存中将是一个很好的尝试。

任何想法我该怎么做? QFileQIODevice开始,它允许我将它ReadAll()转换为QByteArray,但是如何继续并将其分成几行?

QTextStream有ReadAll功能:

http://doc.qt.io/qt-4.8/qtextstream.html#readAll

想必是你所需要的?

或者你可以读入QByteArray,而QTextStream可以将其作为输入而不是QFile。

+1

谢谢!我没有意识到QTextStream可以采用QByteArray。这完全解决了它。 – MadH 2009-06-26 13:18:28

只要您每次读取一行时都不打开和关闭文件,在读取整个文件之前或在读取整个文件时应该没有性能差异(除非处理部分是更快,当你有整个文件工作)。如果你仔细想想,两种方法实际上都在做同样的事情(一次阅读整个文件)。

要小心。有很多效果需要考虑。

对于涉及的字符串处理(或者您对文件所做的任何操作),如果文件缓冲是合理的,则从内存执行并逐行执行文件可能没有性能差异。

实际上调用您的操作系统来执行低级别的读取操作非常昂贵。这就是为什么我们有缓冲I/O。对于小I/O大小,通话的开销占主导地位。因此,一次读取64个字节的效率可能是一次读取256个字节的1/4。 (我在这里讨论的是read(),而不是fgets()或fread(),它们都被缓冲。)

在某个点,物理I/O所需的时间开始占主导地位,对于找到缓冲区大小的较大缓冲区,性能不会提高太多。非常古老的数据点:7MHz Amiga 500,100MB SCSI硬盘(A590 + Quantum):我的I/O性能真的只有在256KB缓冲区大小时才达到最大值。与处理器相比,该磁盘是快速! (电脑只有3MB的RAM,256KB是BIG缓冲区!)

但是,你可以有太多的好东西。一旦你的文件在内存中,操作系统可以在闲暇时将该文件重新分页到磁盘。如果这样做,你已经失去了缓冲的好处。如果你的缓冲区太大,那么在某些负载情况下可能会发生这种情况,并且你的性能会下降。因此请仔细考虑您的运行时环境,并在需要时限制内存占用。

另一种方法是使用mmap()将文件映射到内存中。现在,操作系统不会将您的文件分页 - 相反,它不会导入页面,或者如果需要内存,它将放弃在内核中缓存的任何文件。但它不需要写任何东西来交换空间 - 它有可用的文件。然而,我不确定这是否会带来更好的性能,因为在大块中进行I/O更好,而虚拟内存则倾向于以页面大小的块来移动内容。一些内存管理器可能会做一个体面移动页面的体面工作,以增加I/O带宽和预取页面。但我没有真正仔细研究过这个。

让您的程序首先正常工作。然后优化。

+0

感谢您的评论。当然,我已经开始工作了,这就是为什么要考虑优化的原因。 mmap()不可移植。 – MadH 2009-06-26 22:15:55

你可能

QTextStream (QIODevice * device) 

的QTextStream类提供了读取和写入 文字方便的界面。

QTextStream可以在QIODevice,QByteArray或QString上运行。 使用QTextStream的流媒体运算符,可以方便地读取并编写文字,线条和数字。