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)
我可以想到三个选项来生成编译的输出文件。
我已经在做什么了。
open("comiled.output", "a") as f: f.write(output)在主循环的每个周期使用 with 打开 f_compiled_out
使用 awk 进行简单处理并将输出放在“compiled.output”末尾。
那么(1)保持大文件打开并写入到其末尾与(2)每次写入时打开并附加到它与(3)使用 awk 进行处理并构建文件的开销是多少cat? “编译.输出”。
在任何阶段,整个输出都不需要存储在内存中。
PS,如果有人能看到任何其他明显的事情,当 N_loops 变大时,这些事情会减慢速度,那也太棒了!
打开和关闭文件肯定是有成本的。但是,如果您的旧程序需要一秒或多秒才能响应,您可能不会注意到。
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 来存储数据。