我想知道如何最好地处理 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)
我可以想到三个选项来生成编译的输出文件。
我已经在做什么了。
使用 with 打开 f_compiled_outopen("comiled.output", "a") as f: f.write(output)
在主循环的每个周期
使用 awk 进行简单处理并将输出放在“compiled.output”末尾。
那么(1)保持大文件打开并写入到其末尾与(2)每次写入时打开并附加到它与(3)使用 awk 进行处理和写入的开销是多少?cat
建立“compiled.output”。
在任何阶段,整个输出都不需要存储在内存中。
附:如果有人能看到任何其他明显的事情,当 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
但是,如果您的文件非常大,它会变得更慢:(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 来存储数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)