Python:写入大文件时,保持文件打开还是打开文件并根据需要追加到文件中?

use*_*061 3 python io performance

我想知道如何最好地处理 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)
Run Code Online (Sandbox Code Playgroud)

我可以想到三个选项来生成编译的输出文件。

  1. 我已经在做什么了。

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

  3. 使用 awk 进行简单处理并将输出放在“compiled.output”末尾。

那么(1)保持大文件打开并写入到其末尾与(2)每次写入时打开并附加到它与(3)使用 awk 进行处理并构建文件的开销是多少cat? “编译.输出”。

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

PS,如果有人能看到任何其他明显的事情,当 N_loops 变大时,这些事情会减慢速度,那也太棒了!

gal*_*den 5

打开和关闭文件肯定是有成本的。但是,如果您的旧程序需要一秒或多秒才能响应,您可能不会注意到。

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
Run Code Online (Sandbox Code Playgroud)

但是,如果您的文件非常大,它会变得更慢:(800+mb)

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

12kb 文件:

10 loops, best of 3: 33.4 ms per loop
Run Code Online (Sandbox Code Playgroud)

800mb+ 文件:

1 loops, best of 3: 24.5 s per loop
Run Code Online (Sandbox Code Playgroud)

保持文件打开主要会消耗内存。

我建议使用 SQlite 来存储数据。