2010-10-27 24 views
0

J'essaie une opération de fichier en utilisant python.Aim est de lire en continu un fichier de taille (100bytes), emballer et les envoyer par socket. Ces fichiers sont lus à partir d'un répertoire. Problème: lorsque j'exécute le programme en continu, le temps d'exécution augmente. Initialement, le temps d'exécution est inférieur à une seconde; plus tard, il atteint jusqu'à 8 ~ 10 secondes. Je ne suis pas en mesure d'obtenir la raison exacte du retard. Si quelqu'un peut jeter un peu de lumière sur la question, ce sera plus utile.Lenteur de traitement de fichier en python

Ici, je joins mon code ...

def handlefile(filename): 
     for sat in range(len(Numfiles)): 
       filename = 
       fsize = os.path.getsize(filename) 
       if fsize != 100: 
         continue 
       rfile = open(filename,'rb') 
       text = rfile.read() 
       msg = struct.unpack("<100b",text) 
       for i in range(len(msg)): 
         packMessage = packMessage + struct.pack("<b",msg[i]) 
       print "time:",datetime.datetime.now() - startTime 

Le fichier sont des fichiers binaires.

Temps initial pris: 671 ms

sur l'exécution en continu pendant plus de 10 fois, le temps augmente lentement. Dernières valeurs, 671ms . . . . 9,879 ms 88,686 ms 135,954 ms

J'utilise la version python-2.5.4.

Si quelqu'un avait rencontré un problème similaire. S'il vous plaît, donnez-moi des informations.

Merci Das

+1

Je ne vois pas rfile.close() – soulseekah

+2

Veuillez publier le code courant réel, il y a plusieurs erreurs de syntaxe qui empêcheraient son exécution. –

Répondre

3

Avez-vous vérifié le nombre de fichiers gère votre processus a ouvert? Vous pouvez utiliser le yo with-statement pour vous assurer qu'ils se fermés lorsqu'ils ne sont pas nécessaires plus:

with open(filename, 'rb') as rfile: 
    text = rfile.read() 
    # etc. 

Lorsque le with -bloc reste, le fichier sera automatiquement fermé.

4

D'après ce que je vois, packMessage croît de façon monotone:

packMessage = packMessage + struct.pack("<b",msg[i]) 

Si vous le répéter plusieurs fois, il peut grandir, consommer beaucoup de mémoire, et à un certain moment de votre demande peut devenir beaucoup plus lent. Essayez de regarder top ou htop lorsque vous exécutez votre programme (en top, appuyez sur M pour trier par allocation de mémoire, f pour ajouter le champ de mémoire résident).

Ouvrir et lire le même fichier à chaque fois n'est pas la meilleure solution du point de vue des performances. Ne le lisez qu'une seule fois avant d'entrer dans la boucle.