Eu tenho um script Python que importa um grande arquivo CSV e conta o número de ocorrências de cada palavra no arquivo, depois exporta as contagens para outro arquivo CSV.
Mas o que está acontecendo é que uma vez finalizada a contagem e iniciada a exportação diz-se Killed
no terminal.
Não acho que seja um problema de memória (se fosse, suponho que receberia um erro de memória e não Killed
).
Será que o processo está demorando muito? Em caso afirmativo, há uma maneira de estender o período de tempo limite para que eu possa evitar isso?
Aqui está o código:
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])
E o Killed
acontece depois de finished counting
impresso, e a mensagem completa é:
killed (program exited with code: 137)
killed
vem a mensagem, mas se for devido a ultrapassar algum tipo de limite de memória do sistema, você pode consertar isso usando emcounter.iteritems()
vez decounter.items()
em seu loop final. No Python 2,items
retorna uma lista das chaves e valores no dicionário, o que pode exigir muita memória se for muito grande. Em contraste,iteritems
é um gerador que requer apenas uma pequena quantidade de memória em um determinado momento.Respostas:
O código de saída 137 (128 + 9) indica que seu programa saiu devido ao recebimento do sinal 9, que é
SIGKILL
. Isso também explica akilled
mensagem. A questão é: por que você recebeu esse sinal?O motivo mais provável é que seu processo ultrapassou algum limite na quantidade de recursos do sistema que você tem permissão para usar. Dependendo do seu sistema operacional e da configuração, isso pode significar que você tem muitos arquivos abertos, usa muito espaço no sistema de arquivos ou algo mais. O mais provável é que seu programa estava usando muita memória. Em vez de arriscar que as coisas quebrem quando as alocações de memória começarem a falhar, o sistema enviou um sinal de eliminação para o processo que estava usando muita memória.
Como comentei anteriormente, um motivo pelo qual você pode atingir um limite de memória após a impressão
finished counting
é que sua chamada acounter.items()
em seu loop final aloca uma lista que contém todas as chaves e valores de seu dicionário. Se o seu dicionário tiver muitos dados, esta pode ser uma lista muito grande. Uma possível solução seria usarcounter.iteritems()
qual é um gerador. Em vez de retornar todos os itens em uma lista, permite iterar sobre eles com muito menos uso de memória.Portanto, sugiro tentar isso, como seu loop final:
for key, value in counter.iteritems(): writer.writerow([key, value])
Observe que no Python 3,
items
retorna um objeto de "visualização de dicionário" que não tem a mesma sobrecarga que a versão do Python 2. Ele substituiiteritems
, portanto, se você atualizar posteriormente as versões do Python, acabará alterando o loop de volta ao que era.fonte
Existem duas áreas de armazenamento envolvidas: a pilha e o heap. A pilha é onde o estado atual de uma chamada de método é mantido (isto é, variáveis locais e referências), e o heap é onde os objetos são armazenados. recursão e memória
Imagino que haja muitas chaves no
counter
dicionário que consumirão muita memória da região de heap, portanto, o tempo de execução do Python gerará uma exceção OutOfMemory .Para salvá-lo, não crie um objeto gigante, por exemplo, o balcão .
1.StackOverflow
um programa que cria muitas variáveis locais.
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
um programa que cria um gigante
dict
inclui muitas chaves.>>> 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
Referências
fonte
Duvido que qualquer coisa esteja matando o processo só porque leva muito tempo. Killed genericamente significa que algo externo encerrou o processo, mas provavelmente não neste caso pressionando Ctrl-C, pois isso faria com que o Python fechasse em uma exceção KeyboardInterrupt. Além disso, em Python você obteria a exceção MemoryError se esse fosse o problema. O que pode estar acontecendo é que você está encontrando um bug no Python ou no código da biblioteca padrão que causa uma falha no processo.
fonte
SIGKILL
, a menos que o Python tenha umraise(SIGKILL)
algum lugar em seu código por algum motivo.Provavelmente, você ficou sem memória, então o Kernel matou seu processo.
Você já ouviu falar sobre OOM Killer ?
Aqui está um registro de um script que desenvolvi para processar um grande conjunto de dados de arquivos 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
Foi tirado de
/var/log/syslog
.Basicamente:
Aqui está um artigo sobre o comportamento OOM .
fonte
O mesmo aconteceu comigo quando tentei executar um script Python de uma pasta compartilhada no
VirtualBox
novo Ubuntu 20.04 LTS. Python se recuperouKilled
enquanto carregava minha biblioteca pessoal. Quando movi a pasta para um diretório local, o problema foi embora. Parece que oKilled
parada aconteceu durante as importações iniciais da minha biblioteca, pois recebi mensagens de bibliotecas ausentes ao mover a pasta.O problema foi embora depois que reiniciei meu computador.
Portanto, as pessoas podem querer tentar mover o programa para um diretório local se for sobre um compartilhamento de algum tipo ou pode ser um problema temporário que requer apenas a reinicialização do sistema operacional.
fonte