一次读取,处理和写入一行是否有效?

时间:2015-06-26 11:17:06

标签: algorithm performance file big-o

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

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

    def child():
        import sqlanydb
    
        conn = sqlanydb.connect(uid='dba', pwd='sql', dsn='some_db')
        curs = conn.cursor()
        curs.execute("""SELECT * FROM SA100_1_1;""")
        curs.close()
        conn.close()
    
  2. 在操作中将新行写入输出

    后,在循环中获取每一行
    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()
    
  3. 我应该选择哪一个?

2 个答案:

答案 0 :(得分:2)

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

在极端情况下,有时通过批量编写操作来获得一点效率 - 单个大写操作比许多小写操作更有效。然而,这在现代操作系统中很少相关,因为他们已经在幕后这样做了。

因此,两种方法之间的关键区别在于内存使用 - 在前一种情况下,您拥有更大的内存占用,并且没有获得这样做的优势。因此,你应该选择第二个选择*。

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

答案 1 :(得分:2)

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

  • 如果它很小,使用哪种方法并不重要。

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

  • 如果它真的很大,你将耗尽内存,应用程序将失败。

  • 如果你无法预测行数,那么预先分配行数是有问题的。

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