2010-07-16 5 views
2

Pourquoi ce code manque-t-il de mémoire? Quand je l'exécute, il consomme lentement plus de mémoire à chaque boucle, et j'ai quelque chose comme 300000 boucles. J'utilise Windows et Python 2.6.Pourquoi ce code Python (Django) manque-t-il de mémoire?

def LoadVotes(self): 
    old_votes=Votes.objects.all() 
    amount=old_votes.count() 
    print 'Amount of votes is: ' + str(amount) 
    c=0 
    for row in old_votes: 
     try: 
      new_id_user=LegacyUserId.objects.get(legacy_id=row._login) 
     except LegacyUserId.DoesNotExist: 
      string=" user with old id "+str(row._login)+" does not match new user id /n" 
      log=open('log_add_old_votes.txt','a') 
      log.write(string) 
      continue 
     try: 
      new_id_media=LegacyMedia.objects.get(legacy_id=row.media_file_id) 
     except new_id_media.DoesNotExist: 
      log_text='old media with ID:'+str(row.media_file_id)+' is not found in relation with new media \n' 
      log=open('log_add_old_votes.txt','a') 
      log.write(log_text) 
      continue 
     mo=MediaObject.objects.get(pk=new_id_media.object_id) 
     new_votes_item, created=Mark.objects.get_or_create(user=new_id_user.user, media_object=mo, defaults={'mark':int(row.rate)*2}) 
     c=c+1 
     i=amount-c 
     print '\rRemain:', 
     stdout.write("%d" % i) 
     stdout.flush() 
+1

En partant du bas, supprimez les lignes une à la fois (vous pouvez utiliser la recherche binaire pour un bug pour accélérer cela) jusqu'à ce que le problème disparaisse. Il devrait être assez facile de déterminer quelle (s) ligne (s) mange la mémoire. – Brian

Répondre

5

Si vous utilisez DEBUG = True, django stocke toutes les requêtes en mémoire. Essayez de passer à DEBUG = False dans votre fichier settings.py.

+0

Vous avez raison Débogage = Vrai – Pol

+0

Merci! Tu avais raison. Il est devenu debug = try – Pol

0

sans doute parce qu'il est des objets pour chaque chargement Vote dans votre base de données et itérer ensuite par les votes et le chargement LegacyUserId s pour chacun d'eux, et LegacyMedia objets pour chacun d'eux.

Si la quantité de données que vous avez est grande, ou si ces objets sont volumineux, cela prendra beaucoup de mémoire.

Je ne serais pas surpris si LegacyMedia était un très gros objet lui-même.

+1

Oui mais à chaque boucle il faut effacer les variables. Au lieu de cela, il décrète ma mémoire. Peut-être est-ce que je ne ferme pas le fichier journal et que je boucle chaque fois le fichier d'ouverture, et que je prends plus de mémoire pour ça? Je n'ai pas utilisé log.close() – Pol

1

Vous ne fermez jamais les fichiers ouverts. Vous devriez faire l'accès aux fichiers comme celui-ci

with open('log_add_old_votes.txt','a') as log: 
    log.write(string) 

cette fenêtre fermera l'objet de fichier pour vous une fois que vous avez fini avec elle. Vous utilisez également le même fichier pour chaque message de journal, de sorte que vous pouvez déplacer l'ouverture avant la boucle et utiliser le même objet fichier jusqu'à la fin.

2

Je ne sais pas à quoi ressemble le modèle Vote. Mais vous n'êtes intéressé que par deux attributs de Vote (_login et media_file_id). Vous pouvez donc utiliser les valeurs ou l'API queryset values_list à la place - de cette façon, vous ne sélectionnez que les champs dont vous avez besoin et vous ne créez pas d'objet pour chaque ligne. En outre, selon le nombre de votes que vous possédez par rapport aux lignes LegacyUserId ou LegacyMedia, si vous avez une clé étrangère, vous pouvez simplement sélectionner ces lignes directement via une jointure, plutôt que de parcourir les votes et d'émettre de nouvelles requêtes. les ID existent. Enfin, cela n'affectera pas beaucoup la mémoire, mais pensez à utiliser python logging au lieu de la méthode actuelle. (Ou au moins ouvrir le fichier une fois au début de la fonction au lieu de chaque fois que vous avez besoin d'écrire.)

+0

Je n'ai aucune relation avec mes bases de données (pas de clés étrangères). C'est pourquoi je fais des exemples de tous les modèles dont j'ai besoin. Vous avez raison. J'ai changé mon code. Maintenant, je cherche comment utiliser la journalisation. – Pol

+0

Le problème était avec DEBUG = True. Mais de toute façon merci. – Pol

Questions connexes