Meine Funktion ist auf die folgende Weise Datei zeilenweise zu behandeln. Es sind mehrere Fehlermuster definiert, die für jede Zeile gelten müssen. Ich benutze multiprocessing.Pool, um die Datei in Block zu behandeln.Python re.match rekursiven Anruf Speicherleck
Die Speicherbelegung erhöht sich für eine 1G-Datei auf 2G. Und bleibt in 2G auch nach der Dateiverarbeitung. Datei am Ende geschlossen.
Wenn ich den Aufruf von re_pat.match auskommentieren, ist die Speichernutzung normal und hält unter 100 MB.
verwende ich re in einer falschen Weise? Ich kann keinen Weg finden, das Speicherleck zu beheben.
def line_match(lines, errors)
for error in errors:
try:
re_pat = re.compile(error['pattern'])
except Exception:
print_error
continue
for line in lines:
m = re_pat.match(line)
# other code to handle matched object
def process_large_file(fo):
p = multiprocessing.Pool()
while True:
lines = list(itertools.islice(fo, line_per_proc))
if not lines:
break
result = p.apply_async(line_match, args=(errors, lines))
Hinweise: auslassen ich einige Code, wie ich die signifikanten Unterschied denken, ist mit/ohne re_pat.match (...)
Was genau macht Ihr Code? Es ist nicht klar. –
@ cᴏʟᴅsᴘᴇᴇᴅ Ich aktualisiere den Code-Einzug. Es wird eine Liste von Fehlermustern auf jede Zeile der Datei angewendet, um ein übereinstimmendes Objekt zu finden. – Mayling
Schnelle Frage. Was sind Linien? Woher kommt das? –