一次读取、处理和写入一行是否高效?

Is it efficient to read, process and write one line at a time?

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

  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()
    

我应该选择哪一个?

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

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

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

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

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

  • 如果很小,用什么方法都无所谓。

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

  • 如果真的很大,你会运行内存不足,申请失败。

  • 如果无法预知行数,那么预分配行数组就有问题


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