Bonjour,
En fait, 3 millions de lignes, ce n'est pas beaucoup, et ça se lit très rapidement: ce n'est pas ça qui freine.
Je viens de faire un petit essai. Je fabrique un fichier texte de 3 millions de lignes au hasard entre 0 et 79 caractères alphabétique. Cette fabrication m'a demandé moins de 3 minutes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from random import randint
import time
def creafic(fichier, nblignes):
alpha = "abcdefghijklmnopqrstuvwxyz "
with open(fichier, 'w', encoding="latin1") as fd:
for i in range(0, nblignes):
lg = randint(1,78) # longueur de la ligne
ligne = "".join([alpha[randint(0,26)] for i in range(0,lg)])
fd.write(ligne + '\n')
t = time.clock()
creafic("fichier.txt", 3000000)
t = time.clock()-t
print(t) |
Le fichier construit "fichier.txt" a pour taille 115Mo, soit environ 40 caractères par ligne, ce qui est logique.
Ensuite, on lit toutes les lignes du fichier:
1 2 3 4 5 6 7 8
| def litfic(fichier, taillebuf=-1):
with open(fichier, 'r', buffering=taillebuf, encoding="latin1") as fs:
i = 0
for ligne in fs:
i += 1
x = ligne.rstrip()
# affiche la dernière ligne pour vérifier qu'on les a bien lu toutes
print(i, "=>", x) |
Et la lecture demande... moins de 2 secondes.
Conclusion: c'est sur l'algorithme de traitement des lignes qu'il faut travailler! Dans l'esprit de ce que propose BufferBob.
Mais il est difficile d'aller plus loin sans bien connaître la nature de ces traitements. Par exemple, la ligne
if line[x:y] in listeNomsDF :
suggère qu'il y a une liste "listeNomsDF" dont on ne connait pas la taille. Or, la condition va nécessiter pour chaque ligne de tester la plupart des valeurs de cette liste. Si cette liste est longue, on peut accélérer le test en transformant cette liste en dictionnaire.
Etc...
Partager