Python:写入大文件时,保持文件打开或打开它并根据需要附加到文件中?

时间:2014-05-15 13:19:55

标签: python performance io

我想知道如何最好地处理在python中写入大文件的问题。

我的python代码循环多次运行外部程序(古老的Fortran具有奇怪的输入文件格式),读取其输出(一行文件)执行一些非常简单的处理并写入编译的输出文件。外部程序执行速度很快(大大低于1秒)。

import subprocess as sp

f_compiled_out = open("compiled.output", "w") 

for i in range(len(large_integer)):

  write_input_for_legacy_program = prepare_input()

  sp.call(["legacy.program"])

  with open("legacy.output", "r") as f:
    input = f.readline()

  output = process(input)

  f_compiled_out.write(output)


close(f_compiled_out)

我可以考虑使用三个选项来生成编译的输出文件。

  1. 我现在在做什么。

  2. 在主循环的每个循环中使用open("comiled.output", "a") as f: f.write(output)打开f_compiled_out

  3. 使用awk进行简单处理,并将输出捕获到末尾“compiled.output”。

  4. 那么(1)保持大文件打开并写入结尾的开销是多少(2)打开并附加到每次写入时(#3)使用awk进行处理和{ {1}}建立“compiled.output”。

    在任何阶段,整个输出都不需要在内存中。

    P.S。如果任何人都可以看到任何其他明显的事情会减慢这个速度,因为N_loops变得很大,那也很棒!

1 个答案:

答案 0 :(得分:3)

打开和关闭文件肯定有成本。但是,如果您的遗留程序需要一秒或更长时间才能响应,那么您将不会注意到。

def func1():
    for x in range(1000):
        x = str(x)
        with open("test1.txt", "a") as k:
            k.write(x)

1 loops, best of 3: 2.47 s per loop

def func2():
    with open("test2.txt", "a") as k:
        for x in range(1000):
            x = str(x)
            k.write(x)

100 loops, best of 3: 6.66 ms per loop

但是如果你的文件变得非常大,那就变慢了:(800 + mb)

def func3(file):
    for x in range(10):
        x = str(x)
        with open(file, "a") as k:
            k.write(x)

12kb文件:

10 loops, best of 3: 33.4 ms per loop

800mb +文件:

1 loops, best of 3: 24.5 s per loop

保持文件打开主要花费你的记忆。

我建议使用SQlite存储您的数据。