【问题标题】:Is it efficient to read, process and write one line at a time?一次读取、处理和写入一行是否有效?
【发布时间】:2015-06-26 11:17:05
【问题描述】:

我正在做一个项目,需要读取一个文件,对每一行进行一些操作并生成一个新文件。我有点担心性能。哪种算法更有效?我在下面写了一些伪代码。

  1. 将所有内容存储到数组中,关闭文件,操作每一行并将新数组存储到输出文件:

    openInputFile()
    lineArray[] = readInput()
    closeInputFile()
    
    for (i in lineArray) // i:current line
        manipulate i
        newArray[] += i // store manipulted line to new array
    
    openOutputFile()
    writeOutput(newArray)
    closeOutput()
    
  2. 在循环中获取每一行,操作后将新行写入输出

    openInputFile()
    openOutputFile()
    
    for (i in inputFile) // i:current line
        manipulate i
        print manipulated line to output
    
    closeInputFile()
    closeOutputFile()
    

我应该选择哪一个?

【问题讨论】:

  • 我会选择第一个:如果您按顺序读写,硬盘性能可能会很差。

标签: algorithm performance file big-o


【解决方案1】:

这取决于输入文件的大小:

  • 如果它很小,你使用哪种方法都没有关系。

  • 如果它足够大,那么将整个输入文件和整个输出文件同时保存在内存中的开销可能会对性能产生重大影响。 (增加分页负载等。)

  • 如果真的很大,就会内存不足,应用程序会失败。

  • 如果你无法预测会有多少行,那么预分配线阵列是有问题的。


如果你使用缓冲输入和输出流,第二个版本会更高效,使用更少的内存,并且输入文件太大也不会中断。

【讨论】:

    【解决方案2】:

    在这两种情况下,您从每个文件读取一次,对每个文件写入一次。从这个角度来看,效率并没有太大差异。文件系统擅长缓冲和序列化 IO,而您的磁盘几乎总是这类事情的限制因素。

    在极端情况下,您确实有时通过批量写入操作获得了一点效率 - 单个大型写入比大量小型写入更有效。但是,这在现代操作系统上很少相关,因为他们已经在幕后这样做了。

    因此,这两种方法之间的主要区别在于内存使用 - 在前一种情况下,您的内存占用要大得多,并且不会从中获得任何优势。因此,您应该选择第二个选择*。

    * 除非您确实需要引用数组中的其他位置,例如如果您需要对数据进行排序,因为您确实需要将整个文件拉入内存以对其进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多