我想知道如何最好地处理在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)
我可以考虑使用三个选项来生成编译的输出文件。
我现在在做什么。
在主循环的每个循环中使用open("comiled.output", "a") as f: f.write(output)
打开f_compiled_out
使用awk进行简单处理,并将输出捕获到末尾“compiled.output”。
那么(1)保持大文件打开并写入结尾的开销是多少(2)打开并附加到每次写入时(#3)使用awk进行处理和{ {1}}建立“compiled.output”。
在任何阶段,整个输出都不需要在内存中。
P.S。如果任何人都可以看到任何其他明显的事情会减慢这个速度,因为N_loops变得很大,那也很棒!
答案 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存储您的数据。