2016-04-13 9 views
0

Ich verwende derzeit ein C++ - Skript mit einem Python-Wrapper, um eine größere Textdatei (15 GB) Zeile für Zeile zu bearbeiten. Effektiv liest es eine Zeile aus der Datei input.txt, verarbeitet sie und gibt das Ergebnis an output.txt aus. Ich bin mit der straigtforward Schleife hier (inp als input.txt geöffnet wurde, aus wie output.txt geöffnet):Wie überspringe ich effektiv die ersten n Zeilen in einer Datei mit Python?

for line in inp: 
    result = operate(line) 
    out.write(result) 

jedoch wegen der C++ Skript Fragen, hat es einige Ausfallraten, die die Ursachen Schleife nach etwa zehn Millionen Iterationen. Dies lässt mich mit einer Ausgabedatei, die nur mit 10% der Eingabe gemacht wird.

Da ich keine Möglichkeit habe, das ursprüngliche Skript zu reparieren, dachte ich darüber nach, es einfach dort neu zu starten, wo es aufgehört hat. Ich zählte die Linien von output.txt, machte eine andere namens output2.txt und begann den folgenden Code:

k = 0 
for line in inp: 
    if k < 12123253: 
     k + = 1 
    else: 
     result = operate(line) 
     out2.write(result) 
     k + = 1 

jedoch im Vergleich zu, wenn ich die Linien zählte, die unter einer Minute beendet dieses Verfahren dauert lange Stunden bis zur gewünschten Linie.

Warum ist diese Methode ineffizient? Gibt es einen schnelleren? Ich bin auf einem Windows-PC mit einer starken Rechenleistung (72 GB RAM, gute Prozessoren) und Python 2.7.

+0

Ich denke, tell (aufzuzeichnen, wo Sie waren) und suchen (in Ihrem nächsten Lauf zu diesem Punkt zurückzukehren) wahrscheinlich aus Ihnen helfen könnten. http://stackoverflow.com/questions/3299213/python-how-can-i-open-a-file-and-specify-the-offset-in-bytes –

Antwort

5

Ich schlage vor, Sie itertools

with open(inp) as f: 
    result = itertools.islice(f, start_line, None) 
    for i in result: 
     #do something with this line 
+0

Dies wird immer noch durch die ganze Datei bis zu dem Punkt lesen Interesse. –

1

verwenden Sie file.seek und file.tell verwenden. Im Folgenden finden Sie die Probe (Pseudo-) Code:

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) 
Verwandte Themen