Je dois traiter quelques très gros fichiers (> 90 Go chacun). Seule une petite partie des fichiers est importante pour moi. Je veux parcourir les fichiers et écrire les lignes nécessaires dans un autre fichier, donc je n'ai pas besoin de traiter de tels fichiers à chaque fois que j'exécute un test. Chaque ligne est d'environ 1000 caractères.python - traitement de fichiers très volumineux (> 90 Go)
J'utilise le code suivant:
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
Le problème est, à chaque fois que je lance le script, le processus se coince autour 10.000.000th ligne. Lorsque j'utilise la commande htop
, je peux voir que Python n'utilise qu'environ 8 Go de RAM lorsqu'il est bloqué, et que la mémoire virtuelle utilisée continue d'augmenter et que le système d'exploitation tue le processus après un certain temps.
J'ai utilisé des fichiers différents, mais aussi Python 2.7 et 3.5. J'ai également essayé d'utiliser with open(inputFile, 'r', 16777216)
pour utiliser la mise en mémoire tampon mais le résultat n'a pas changé. Je cours le code sur MacOS Sierra 10.12.4 et la machine a 16GBs de RAM.
Des idées?
Que fait appendToFile() '? Vous devez inclure un exemple complet, qui inclut * tout * le code requis pour reproduire le problème ("[mcve]"). – Carpetsmoker
Ne pas poster votre code dans les commentaires, vous pouvez [modifier] votre question ;-) – Carpetsmoker
@Carpetsmoker édité :) – gokhan