web-dev-qa-db-fra.com

Que veut dire "tué"?

J'ai un script Python) qui importe un fichier CSV volumineux, puis compte le nombre d'occurrences de chaque mot dans le fichier, puis exporte les comptes dans un autre fichier CSV.

Mais ce qui se passe, c'est qu'une fois que la partie de comptage est terminée et que l'exportation commence, elle indique Killed en fin de chaîne.

Je ne pense pas que ce soit un problème de mémoire (si c'était le cas, je suppose que ce serait une erreur de mémoire et non pas 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'attente 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 le Killed arrive après finished counting a été imprimé et le message complet est le suivant:

killed (program exited with code: 137)
64
user1893354

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 le message killed. La question est, pourquoi avez-vous reçu ce signal?

La raison la plus probable est probablement que votre processus a dépassé certaines limites en termes de 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, trop d'espace disque utilisé ou quelque chose d'autre. Le plus probable est que votre programme utilisait trop de mémoire. Plutôt que de risquer des problèmes lorsque les allocations de mémoire ont commencé à échouer, le système a envoyé un signal de destruction au processus qui utilisait trop de mémoire.

Comme je l'ai dit plus tôt, une des raisons pour lesquelles vous pouvez atteindre une limite de mémoire après avoir imprimé finished counting Est que votre appel à counter.items() dans votre boucle finale alloue une liste contenant toutes les clés et les valeurs de votre dictionnaire. . Si votre dictionnaire contient beaucoup de données, la liste pourrait être très longue. Une solution possible serait d'utiliser counter.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 en utilisant 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 que dans Python 3, items renvoie un objet "vue du dictionnaire" qui n'a pas la même surcharge que la version de Python 2. Il remplace iteritems, donc si vous mettez à niveau ultérieurement Python versions, vous finirez par remettre la boucle à son état initial.

77
Blckknght

Deux zones de stockage sont impliquées: la pile et le segment de mémoire. La pile indique l'état actuel d'un appel de méthode (variables et références locales) et le segment de mémoire dans lequel les objets sont stockés. récursivité et mémoire

Je pense qu'il y a trop de clés dans le dict counter qui consomment trop de mémoire de la région du tas, de sorte que le Python runtime lève un OutOfMemory exception.

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 inclut 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

19
ROY

Je doute que tout tue le processus simplement parce que cela prend beaucoup de temps. Tué génériquement signifie que quelque chose venant de l'extérieur a mis fin au processus, mais probablement pas dans ce cas d'appuyer sur Ctrl-C car cela entraînerait Python à se fermer sur une exception KeyboardInterrupt. En outre, dans Python vous auriez une exception MemoryError si tel était le problème, ce qui pourrait se produire si vous rencontrez un bogue dans Python ou un code de bibliothèque standard qui provoque un blocage du processus.

2
Wingware