J'ai un script Python qui importe un gros fichier CSV, puis compte le nombre d'occurrences de chaque mot dans le fichier, puis exporte les comptes vers un autre fichier CSV.
Mais ce qui se passe, c'est qu'une fois que cette partie de comptage est terminée et que l'exportation commence, il est dit Killed
dans le terminal.
Je ne pense pas que ce soit un problème de mémoire (si c'était le cas, je suppose que j'aurais une erreur de mémoire et non Killed
).
Se pourrait-il que le processus prenne trop de temps? Si tel est le cas, existe-t-il un moyen de prolonger le délai d'expiration afin que je puisse éviter cela?
Voici le code:
csv.field_size_limit(sys.maxsize)
counter={}
with open("/home/alex/Documents/version2/cooccur_list.csv",'rb') as file_name:
reader=csv.reader(file_name)
for row in reader:
if len(row)>1:
pair=row[0]+' '+row[1]
if pair in counter:
counter[pair]+=1
else:
counter[pair]=1
print 'finished counting'
writer = csv.writer(open('/home/alex/Documents/version2/dict.csv', 'wb'))
for key, value in counter.items():
writer.writerow([key, value])
Et ce qui Killed
se passe après finished counting
s'est imprimé, et le message complet est:
killed (program exited with code: 137)
killed
provenance du message, mais si cela est dû au dépassement d'une sorte de limite de mémoire système, vous pourrez peut-être résoudre ce problème en utilisantcounter.iteritems()
au lieu decounter.items()
dans votre boucle finale. Dans Python 2,items
renvoie une liste des clés et des valeurs du dictionnaire, ce qui peut nécessiter beaucoup de mémoire s'il est très volumineux. En revanche,iteritems
est un générateur qui ne nécessite qu'une petite quantité de mémoire à un moment donné.Réponses:
Le code de sortie 137 (128 + 9) indique que votre programme s'est arrêté en raison de la réception du signal 9, qui est
SIGKILL
. Cela explique également lekilled
message. La question est, pourquoi avez-vous reçu ce signal?La raison la plus probable est probablement que votre processus a dépassé une certaine limite dans la quantité de ressources système que vous êtes autorisé à utiliser. En fonction de votre système d'exploitation et de votre configuration, cela peut signifier que vous avez trop de fichiers ouverts, utilisé trop d'espace dans le système de fichiers ou autre chose. Le plus probable est que votre programme utilisait trop de mémoire. Plutôt que de risquer des ruptures lorsque les allocations de mémoire ont commencé à échouer, le système a envoyé un signal d'arrêt au processus qui utilisait trop de mémoire.
Comme je l'ai commenté plus tôt, une des raisons pour lesquelles vous pourriez atteindre une limite de mémoire après l'impression
finished counting
est que votre appel àcounter.items()
dans votre boucle finale alloue une liste qui contient toutes les clés et valeurs de votre dictionnaire. Si votre dictionnaire contenait beaucoup de données, cela pourrait être une très grande liste. Une solution possible serait d'utilisercounter.iteritems()
qui est un générateur. Plutôt que de renvoyer tous les éléments d'une liste, il vous permet de les parcourir avec beaucoup moins de mémoire.Donc, je suggérerais d'essayer ceci, comme dernière boucle:
for key, value in counter.iteritems(): writer.writerow([key, value])
Notez qu'en Python 3,
items
retourne un objet "vue dictionnaire" qui n'a pas la même surcharge que la version de Python 2. Il remplaceiteritems
, donc si vous mettez à niveau plus tard les versions de Python, vous finirez par changer la boucle comme elle était.la source
Il y a deux zones de stockage impliquées: la pile et le tas. La pile est l'endroit où l'état actuel d'un appel de méthode est conservé (c.-à-d. Les variables locales et les références), et le tas est l'endroit où les objets sont stockés. récursion et mémoire
Je pense qu'il y a trop de clés dans le
counter
dict qui consommeront trop de mémoire de la région du tas, donc le runtime Python lèvera une exception OutOfMemory .Pour le sauvegarder, ne créez pas d'objet géant, par exemple le compteur .
1.StackOverflow
un programme qui crée trop de variables locales.
Python 2.7.9 (default, Mar 1 2015, 12:57:24) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> f = open('stack_overflow.py','w') >>> f.write('def foo():\n') >>> for x in xrange(10000000): ... f.write('\tx%d = %d\n' % (x, x)) ... >>> f.write('foo()') >>> f.close() >>> execfile('stack_overflow.py') Killed
2.OutOfMemory
un programme qui crée un géant
dict
comprend trop de clés.>>> f = open('out_of_memory.py','w') >>> f.write('def foo():\n') >>> f.write('\tcounter = {}\n') >>> for x in xrange(10000000): ... f.write('counter[%d] = %d\n' % (x, x)) ... >>> f.write('foo()\n') >>> f.close() >>> execfile('out_of_memory.py') Killed
Références
la source
Je doute que quoi que ce soit tue le processus simplement parce que cela prend beaucoup de temps. Tué signifie génériquement que quelque chose de l'extérieur a mis fin au processus, mais probablement pas dans ce cas en appuyant sur Ctrl-C car cela provoquerait la fermeture de Python sur une exception KeyboardInterrupt. De plus, en Python, vous obtiendrez une exception MemoryError si c'était le problème. Ce qui peut se passer, c'est que vous rencontrez un bogue dans Python ou dans le code de bibliothèque standard qui provoque un blocage du processus.
la source
SIGKILL
, à moins que Python n'ait unraise(SIGKILL)
quelque part dans son code pour une raison quelconque.Très probablement, vous avez manqué de mémoire, donc le noyau a tué votre processus.
Avez-vous entendu parler de OOM Killer ?
Voici un journal d'un script que j'ai développé pour traiter un énorme ensemble de données à partir de fichiers CSV:
Mar 12 18:20:38 server.com kernel: [63802.396693] Out of memory: Kill process 12216 (python3) score 915 or sacrifice child Mar 12 18:20:38 server.com kernel: [63802.402542] Killed process 12216 (python3) total-vm:9695784kB, anon-rss:7623168kB, file-rss:4kB, shmem-rss:0kB Mar 12 18:20:38 server.com kernel: [63803.002121] oom_reaper: reaped process 12216 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
Il a été pris de
/var/log/syslog
.Fondamentalement:
Voici un article sur le comportement du MOO .
la source
J'ai juste eu la même chose sur moi lorsque j'ai essayé d'exécuter un script python à partir d'un dossier partagé
VirtualBox
dans le nouveau Ubuntu 20.04 LTS. Python s'est sauvéKilled
lors du chargement de ma propre bibliothèque personnelle. Lorsque j'ai déplacé le dossier vers un répertoire local, le problème a disparu. Il semble que leKilled
arrêt s'est produit lors des importations initiales de ma bibliothèque car j'ai reçu des messages de bibliothèques manquantes une fois que j'ai déplacé le dossier.Le problème a disparu après le redémarrage de mon ordinateur.
Par conséquent, les gens peuvent vouloir essayer de déplacer le programme vers un répertoire local s'il s'agit d'un partage quelconque ou s'il peut s'agir d'un problème transitoire qui nécessite simplement un redémarrage du système d'exploitation.
la source