Je rencontre un problème avec le traitement d'un fichier volumineux en Python. Tout ce que je fais estProblèmes de vitesse de traitement du fichier texte Python
f = gzip.open(pathToLog, 'r')
for line in f:
counter = counter + 1
if (counter % 1000000 == 0):
print counter
f.close
Cela prend environ 10m25s juste pour ouvrir le fichier, lire les lignes et incrémenter ce compteur.
En Perl, traitant du même fichier et faisant un peu plus (quelque chose d'expression régulière), l'ensemble du processus prend environ 1m17s.
Perl code:
open(LOG, "/bin/zcat $logfile |") or die "Cannot read $logfile: $!\n";
while (<LOG>) {
if (m/.*\[svc-\w+\].*login result: Successful\.$/) {
$_ =~ s/some regex here/$1,$2,$3,$4/;
push @an_array, $_
}
}
close LOG;
Quelqu'un peut-il conseiller ce que je peux faire pour faire fonctionner la solution Python à une vitesse similaire à la solution Perl?
EDIT J'ai essayé juste décompressé le fichier et de traiter avec l'aide ouverte au lieu de gzip.open, mais qui ne change le temps total à environ 4m14.972s, ce qui est encore trop lent. J'ai aussi enlevé les instructions modulo et print et les ai remplacées par pass, donc tout ce qui est en train de se faire est de passer d'un fichier à un autre.
Ce ne sont pas la même chose. La version PERL exécute deux processus simultanés. Vous devriez envisager d'utiliser une solution à deux processus en Python avant d'appeler Python lent. –
En outre, vous imprimez quelque chose dans votre boucle dans la version Python, mais pas la version Perl. L'impression est relativement lente. –
@Thomas mais tous les 1 million d'enregistrements ne devraient pas être le problème. Je pense que le si et modulo chaque enregistrement est plus d'un problème que l'impression elle-même. – extraneon