猿问

使用BufferedReader读取大型文本文件,打印每行的速度有多慢?

我创建了一个程序来读取一个非常大的文本文件(2.5 GB),并将每行重写为一个新的文本文件,格式符合我的要求。一切都很顺利,但是当我写它时,我放了一个小的“println”,它读取行用于测试目的,看看它是否正常工作。一切都很顺利,所以我启动了它,离开了计算机,3小时后回来,看到我在那里留下了调试消息。我的问题是,如果我读/写大约46,000,000行,这会让我放慢速度吗?将它阻止到这么远以将其删除是明智的吗?


小怪兽爱吃肉
浏览 149回答 3
3回答

慕勒3428872

好吧,我猜这大约会使ETA翻倍,因为您基本上在日志中创建文件的另一个副本;-)检查你已经走了多远 - 然后考虑杀死这个过程....

饮歌长啸

整个过程有两件事负责 -中央处理器IO 设备最初,当您将行从一个文件复制到另一个文件时,该过程不涉及 IO 设备(因为您没有打印任何行)。因此,CPU没有等待时间。因此,该过程在更短的时间内完成。当您引入 println 语句时,对于 CPU 从第一个文件读取的每一行,它必须将该行发送到 IO 设备进行打印。将线路发送到 IO 设备后,CPU 必须等待它完成作业。IO 设备完成打印后,CPU 将继续该过程并将该行粘贴到第二个文件中。此过程将继续,直到第一个文件中的所有行都复制到第二个文件。因此,对于文件中的每一行,CPU必须等待一定的时间。这是处理时间增加的第一个原因。其次,IO 打印会创建文件的另一个副本。因此,现在您正在创建 2 个副本而不是一个副本。46,000,000 行?Let's take the time taken by each operation in the process is 1 microsecond.Initially - Time took by CPU to copy a line = 1 microsecondTime took by CPU to paste a line = 1 microsecondTotal time for copying 46,000,000 lines = 46,000,000 microsecond = 46 secTotal time for pasting 46,000,000 lines = 46,000,000 microsecond = 46 secTotal time of the entire process = 92 sec.普印本介绍Time took by CPU to copy a line = 1 microsecondTime took by IO to paste a line = 1 microsecondTime took by CPU to paste a line = 1 microsecondWaiting time of CPU for every line = 1 microsecondTotal time taken by CPU for copying 46,000,000 lines = 46,000,000 microsecond = 46 secTotal time taken by IO for copying 46,000,000 lines = 46,000,000 microsecond = 46 secWaiting time of CPU = 46,000,000 microsecond = 46 secTotal time by CPU for pasting 46,000,000 lines = 46,000,000 microsecond = 46 secTotal time of the entire process = 184 sec.

函数式编程

“调试”的额外成本非常依赖于平台。println如果将 您路由到控制台,则可能会因与控制台相关的额外处理而减慢速度。在Windows上默认控制台非常慢,在Linux上是如此之多。PrintStream此外,如果您正在使用/,您将配置为在每次添加额外开销后冲洗。System.outSystem.errPrintStreamprintln3小时处理2.5 GiB的磁盘是非常慢的。因此,要么你的代码是复杂的,额外的调试行对整体性能的影响很小,要么你是在Windows上写入默认控制台(在以后的情况下,调试是一个巨大的问题)。println
随时随地看视频慕课网APP

相关分类

Java
我要回答