逐行读取文件与读取整个文件时的性能

时间:2011-10-10 03:56:26

标签: c++ performance qt processing-efficiency

与一次读取整个文件相比,逐行读取时是否存在显着差异(理论上)?

读取整个文件确实会对使用的内存量产生负面影响,但它的工作速度会更快吗?

我需要读取文件并处理每一行。我不知道我是否应该一次读取一行并处理它,或者读取整个文件,处理所有行,然后写入输出。

我已经将prgm设置为逐行读取,我想知道是否值得努力将其更改为读取整个文件(鉴于我的设置并不容易)。

谢谢,

6 个答案:

答案 0 :(得分:2)

读取整个文件会稍快一点 - 但不多!

但要小心阅读整个文件是不可扩展的,因为你受到系统中可用内存的限制,一旦文件大小超过你的程序的RAM avaibale大小,它将开始使用交换空间会慢很多。如果文件大小超过可用虚拟内存的大小,那么程序将崩溃。

答案 1 :(得分:1)

与其他人一样,我相信做更大的读取会改善你的应用程序的性能,但不要指望奇迹,I / O已经在OS层缓冲,所以你只能通过减少开销来获得有太多的阅读电话。除非您知道输入文件的最大可能大小,否则一次读取整个文件是危险的。最合理的方法是以大块读取文件。

如果您想进一步提高,则应考虑将I / O与处理重叠。假设您以128MB的块读取输入文件。在主线程上,您读取第一个128MB块,然后将其传递给工作线程进行处理。当工作线程开始工作时,主线程读取第二个128MB块。从那时起,当工作线程处理块N时,主线程正从磁盘读取块N + 1.

答案 2 :(得分:0)

老实说,在我的学位课程中研究了一段时间的效率后,我得出了关于你的问题的结论:这取决于这个文件的阅读频率。如果你只阅读一次,那么就完成整个过程,因为这样可以释放其他任务的过程。 还有一件事需要记住,是文件将在以后编辑并需要更新(如只读更新的部分?)如果是这样,你可能需要设置一个标记来重新定位从哪里读取(然后再次它多久更新一次?)。但是,如果它是一次性工作,请继续阅读它作为一个整体,只要您不需要在文件中创建某些文字的标记。 希望这有帮助。

答案 3 :(得分:0)

将整个文件读入内存通常不是一个好主意,因为文件可能很大,可能占用大量内存,最坏的情况是耗尽内存。因此,为了平衡性能和内存使用情况,您需要将一个文件块读入缓冲区并通过缓冲区进行解析。处理完块后,读取下一个块,直到EOF。

必须根据您想要达到的目标来确定好的块大小。

答案 4 :(得分:0)

一个因素是您将要阅读的数据量,以及程序最初运行的时间长短,即在处理性能方面是否有任何好处。

请参阅this answer中的书籍引用,了解有关思考软件性能的一些好的一般性建议。

(我知道你在理论上是的答案,但是当你花费有限的时间时,这个何时担心性能的方面也很重要。)

答案 5 :(得分:0)

我认为这取决于您的应用程序的需求(就像我知道的大多数事情一样)。使用fs.readFile()读取节点js中的1 MB文件比使用可读流或行读取器快大约3-4倍,只要文件读取即可。如果文件非常大并且您正在处理输入,Streams可能会提供一些额外的性能。如果您的应用程序已占用大量内存,因为Node进程在64位系统上具有~1.5 GB的内存限制,这也可能是理想的选择。如果数据源相对于cpu处理它的速度较慢(HDD或磁带上的存档,TCP等网络连接),处理块进入时处理块也可能更高效。至于将文件读入内存而不是将其流式传输到内存中,我猜测发出数据事件的函数调用开销以及切换到处理函数回调会减慢进程。