Ich muss ein paar sehr große Dateien (> 90GB) verarbeiten. Nur ein kleiner Teil der Dateien ist wichtig für mich. Ich möchte die Dateien durchsuchen und die erforderlichen Zeilen in eine andere Datei schreiben. Daher muss ich nicht jedes Mal, wenn ich ein Experiment durchführe, so große Dateien verarbeiten. Jede Zeile hat ungefähr 1000 Zeichen.Python - Verarbeitung sehr großer Dateien (> 90GB)
Ich verwende den folgenden Code ein:
def readFile(inputFile, outputFile):
startDate = datetime.datetime.strptime('10/06/2010 00:00:00', '%m/%d/%Y %H:%M:%S')
endDate = datetime.datetime.strptime('10/13/2010 23:59:59', '%m/%d/%Y %H:%M:%S')
total_lines = 0
with open(inputFile, 'r') as a_file:
for a_line in a_file:
total_lines += 1
id, date, content = splitLine(a_line)
datetime_object = datetime.datetime.strptime(date, '%m/%d/%Y %H:%M:%S')
if (datetime_object > startDate and datetime_object < endDate):
appendToFile(outputFile, a_line)
return total_lines
def splitLine(long_string):
values = long_string.split(",")
return values[0],values[1],values[2]
def appendToFile(outputFile, outputString):
try:
file = open(outputFile, 'a+')
file.write(outputString)
file.close()
except Exception as ex:
print("Error writing to file: " + outputFile)
return
Das Problem ist, jedes Mal wenn ich das Skript ausführen, wird der Prozess um 10.000.000th Linie fest. Wenn ich den Befehl htop
benutze, kann ich sehen, dass Python nur etwa 8 GB RAM verwendet, wenn es steckenbleibt, und der verwendete virtuelle Speicher nimmt zu und das Betriebssystem tötet den Prozess nach einer Weile.
Ich habe verschiedene Dateien verwendet, und auch beide Python 2.7 und 3.5. Ich versuchte auch, with open(inputFile, 'r', 16777216)
zu verwenden, Pufferung zu verwenden, aber das Ergebnis änderte sich nicht. Ich benutze den Code auf macOS Sierra 10.12.4 und der Rechner hat 16 GB RAM.
Irgendwelche Ideen?
Was bewirkt 'appendToFile()'? Sie sollten ein vollständiges Beispiel angeben, das * all * enthält, das der Code benötigt, um das Problem zu reproduzieren ("[mcve]"). – Carpetsmoker
Poste deinen Code nicht in Kommentaren, du kannst deine Frage bearbeiten ;-) – Carpetsmoker
@Carpetsmoker bearbeitet :) – gokhan