【问题标题】:Reading a large text file using BufferedReader, how badly does printing each line slow down the process?使用 BufferedReader 读取大型文本文件,打印每一行会减慢进程的速度有多严重?
【发布时间】:2019-03-25 09:42:13
【问题描述】:

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

【问题讨论】:

    标签: java performance bufferedreader bufferedwriter


    【解决方案1】:

    好吧,我猜这将使 ETA 大约翻倍,因为您基本上是在日志中创建文件的另一个副本;-)

    检查你已经走了多远 - 然后考虑终止进程....

    【讨论】:

      【解决方案2】:

      “调试”println 的额外成本非常依赖于平台。

      如果您的 PrintStream 被路由到控制台,您可能会因与控制台相关的额外处理而减慢速度。在 Windows 上默认控制台速度非常慢,在 Linux 上则慢得多。

      此外,如果您使用System.out/System.err,您的PrintStream 将被配置为在每个println 之后刷新,从而增加额外开销。

      3 小时处理 2.5 GiB 的磁盘非常慢。所以要么你的代码很复杂,额外的调试行对整体性能影响不大,要么你在 Windows 上写入默认控制台(在以后的情况下调试 println 是一个大问题)。

      【讨论】:

        【解决方案3】:

        整个过程有两件事负责——

        1. CPU
        2. IO 设备

        最初,当您将行从一个文件复制到另一个文件时,该过程中不涉及任何 IO 设备(因为您没有打印任何行)。因此,CPU 没有等待时间。因此,该过程在更短的时间内完成。

        当你引入 println 语句时,对于 CPU 从第一个文件中读取的每一行,它必须将该行发送到 IO 设备进行打印。将线路发送到 IO 设备后,CPU 必须等待它完成工作。一旦 IO 设备完成打印,CPU 将继续该过程并将该行粘贴到第二个文件中。这个过程将一直持续到第一个文件中的所有行都复制到第二个文件中为止。

        因此,对于文件中的每一行,CPU 必须等待一定的时间。这是处理时间增加的第一个原因。其次,IO 打印会创建文件的另一个副本。所以,现在您要创建 2 个副本而不是 1 个。

        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 microsecond
        Time took by CPU to paste a line = 1 microsecond
        Total time for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
        Total time for pasting 46,000,000 lines = 46,000,000 microsecond = 46 sec
        Total time of the entire process = 92 sec.
        

        Println 介绍

        Time took by CPU to copy a line = 1 microsecond
        Time took by IO to paste a line = 1 microsecond
        Time took by CPU to paste a line = 1 microsecond
        Waiting time of CPU for every line = 1 microsecond
        
        Total time taken by CPU for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
        Total time taken by IO for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
        Waiting time of CPU = 46,000,000 microsecond = 46 sec
        Total time by CPU for pasting 46,000,000 lines = 46,000,000 microsecond = 46 sec
        
        Total time of the entire process = 184 sec.
        

        希望这能回答您的问题!

        【讨论】:

          猜你喜欢
          • 2022-11-22
          • 2016-07-08
          • 1970-01-01
          • 2020-07-01
          • 2017-04-02
          • 2013-04-12
          • 2017-03-20
          • 2019-02-20
          • 2011-12-14
          相关资源
          最近更新 更多