我目前正在使用带有Python包装器的C ++脚本来逐行操作更大的(15 GB)文本文件。它的有效作用是从input.txt读取一行,处理它,将结果输出到output.txt。我在这里使用straigtforward循环(inp作为input.txt打开,out作为output.txt打开):
for line in inp:
result = operate(line)
out.write(result)
但是,由于C ++脚本的问题,它有一些失败率,导致循环在大约一千万次迭代后关闭。这使我得到的输出文件只使用了10%的输入。
由于我无法修复原始脚本,所以我只想重新启动它停止的地方。我计算了output.txt的行,创建了另一个名为output2.txt的行,并启动了以下代码:
k = 0
for line in inp:
if k < 12123253:
k + = 1
else:
result = operate(line)
out2.write(result)
k + = 1
然而,与我计算在一分钟内结束的线路相比,这种方法需要很长时间才能到达指定的线路。
为什么这种方法效率低下?有更快的吗?我在Windows PC上具有强大的计算能力(72GB RAM,良好的处理器),并使用python 2.7。
答案 0 :(得分:5)
我建议您使用itertools
with open(inp) as f:
result = itertools.islice(f, start_line, None)
for i in result:
#do something with this line
答案 1 :(得分:1)
您可以使用file.seek和file.tell。下面是示例(伪)代码:
def seralizebreakpoint(pos):
pass
def desearializebreakpoint():
'''return -1 if there is actually no break point'''
pass
def process(inp):
pos = inp.tell()
for line in inp:
try:
result = operate(line)
pos = inp.tell()
except:
seralizebreakpoint(pos)
raise
def processEntry(pathtoinput):
bp = desearializebreakpoint()
with open(pathtoinput, 'r') as inp:
if bp > -1:
inp.seek(bp)
process(inp)