2009-11-28 8 views
13

Fondamentalement, j'ai une liste de 30 000 URL. Le script parcourt les URL et les télécharge (avec un délai de 3 secondes entre les deux). Et puis il stocke le code HTML dans une base de données.Pourquoi mon script python est-il tué de manière aléatoire?

Et des boucles et des boucles ...

Pourquoi faut-il obtenir au hasard « tué. »? Je n'ai rien touché. Edit: cela se passe sur 3 de mes machines Linux. Les machines sont sur un cloud Rackspace avec 256 Mo de mémoire. Rien d'autre ne fonctionne.

+0

Il serait probablement utile de fournir des informations sur l'environnement dans lequel votre script est en cours d'exécution. Par exemple, l'exécutez-vous sur votre propre serveur ou sur un hôte partagé? Quelles autres choses fonctionnent? Etc ... – Amber

+6

Une trace d'erreur serait utile. Sinon, nous ne faisons que deviner. Je suppose que c'est Zombies de la zone 51. –

+0

Il n'y a aucune erreur. Il dit juste "tué". – TIMEX

Répondre

18

Il semblerait que vous ayez peu de mémoire - cela peut facilement se produire sur un programme de longue durée si vous avez une "fuite" (par exemple, en raison de l'accumulation de références circulaires). Rackspace offre-t-il des outils facilement utilisables pour suivre la mémoire d'un processus, de sorte que vous pouvez confirmer si c'est le cas? Sinon, ce genre de chose n'est pas difficile à surveiller avec des outils Linux normaux en dehors du processus. Une fois que vous avez déterminé que "out of memory" est la cause probable de la mort, les outils spécifiques à Python tels que pympler peuvent vous aider à savoir exactement d'où vient le problème (et ainsi déterminer comment éviter ces références - que ce soit en changeant à des références faibles, ou à d'autres approches plus simples - ou sinon supprimer les fuites).

+0

Je pense qu'il manque de mémoire, non? Mem: 262364k total, 258264k utilisé, 4100k libre, 884k tampons Échange: 524280k total, 285204k utilisé, 239076k gratuit, 14568k mis en cache – TIMEX

+1

le SWAP continue à monter et à monter. – TIMEX

+0

@alex, alors définitivement ça ressemble à une "fuite". Outre pympler, que j'ai déjà suggéré, essayez guppy - http://guppy-pe.sourceforge.net/ - ils peuvent vous aider à identifier ** où ** tout ce qui se passe (en regardant votre code, que vous avez publié comme une autre question, sans connaître toutes les bibliothèques tierces que vous utilisez, n'est nulle part aussi utile!). –

1

Est-il possible que cela frappe une exception non interceptée? Exécutez-vous cela à partir d'un shell, ou est-il lancé depuis cron ou d'une autre manière automatisée? Si elle est automatisée, la sortie peut ne pas être affichée n'importe où.

14

Dans ce cas, vérifiez les fichiers journaux.

J'utilise Debian et Ubuntu, de sorte que le fichier journal principal pour moi est: /var/log/syslog

Si vous utilisez Red Hat, je pense que journal est: /var/log/messages

Si quelque chose se passe qui est aussi exceptionnel que la Noyau tuer votre processus, sera être un événement de journal l'expliquant.

Je suppose que vous êtes touché par le Out Of Memory Killer.

1

Utilisez-vous un gestionnaire de files d'attente ou un gestionnaire de processus quelconque? J'ai reçu des messages apparemment aléatoires lorsque le gestionnaire de files d'attente par lots que j'utilisais envoyait SIGUSR2 lorsque le temps était écoulé.

Sinon, je favorise fortement l'option de mémoire insuffisante.

0

Pour ceux qui sont venus ici avec mysql, je trouve cette réponse peut par utile:

utilisation SSCursor comme suggented par this

conn = MySQLdb.connect(host=DB_HOST, user=DB_USER, db=DB_NAME, 
         passwd=DB_PASSWORD, charset="utf8", 
         cursorclass=MySQLdb.cursors.SSCursor) 

et itérer sur le curseur comme suggéré par this

cursor = conn.cursor() 
cursor.execute("select * from very_big_table;")  
for row in cur: 
    # do what you want here 
    pass 

Faites attention à ce que le doc dit You MUST retrieve the entire result set and close() the cursor before additional queries can be peformed on the connection., donc si vous voulez écrire et en même temps, vous devez utiliser une autre connexion, ou vous obtiendrez

`_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")` 
Questions connexes