9

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

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

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

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

谢谢,

4

6 回答 6

3

读取整个文件会稍微快一些——但不会太多!

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

于 2011-10-10T04:06:33.033 回答
2

像其他人一样,我相信做更大的读取会提高你的应用程序的性能,但不要指望奇迹,I/O 已经在操作系统层缓冲,所以你只能通过减少过多的开销来获得收益阅读电话。一口气读取整个文件是危险的,除非您知道输入文件的最大可能大小。最合理的方法是大块读取文件。

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

于 2011-10-10T06:38:15.963 回答
2

我认为这取决于您的应用程序的需求(就像大多数事情一样,我知道)。就文件读取而言,使用 fs.readFile() 在 Node js 中读取 1 MB 文件比使用可读流或行读取器快 3-4 倍。如果文件非常大并且您正在动态处理输入,流可能会提供一些额外的性能。如果您的应用程序已经消耗大量内存,因为 Node 进程在 64 位系统上的内存限制约为 1.5 GB,这也可能是理想的选择。如果数据源相对于 CPU 处理数据的速度慢(HDD 或磁带上的存档、TCP 等网络连接),则处理数据块时的性能也可能更高。至于将文件读入内存与将文件流式传输到内存中,

于 2016-05-17T18:51:49.957 回答
1

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

必须根据您想要实现的目标来确定一个好的块大小。

于 2011-10-10T04:03:57.230 回答
0

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

于 2011-10-10T04:03:53.943 回答
0

一个因素是您将要读取多少数据,以及程序最初运行需要多长时间,即提高性能是否有任何好处。

有关考虑软件性能的一些好的一般建议,请参阅此答案中的书籍引用。

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

于 2011-10-10T05:42:46.137 回答