Что означает «убитый»?

У меня есть скрипт Python, который импортирует большой CSV-файл, а затем подсчитывает количество вхождений каждого слова в файл, а затем экспортирует подсчеты в другой CSV-файл.

Но то, что происходит, состоит в том, что как только эта подсчетная часть будет завершена, и начнется экспорт, это говорит о смерти в терминале.

Я не думаю, что это проблема памяти (если бы я предположил, что получаю ошибку памяти, а не Killed ).

Может быть, процесс слишком длительный? Если да, существует ли способ продлить период тайм-аута, чтобы я мог избежать этого?

Вот код:

 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]) 

И Killed происходит после того, как finished counting , и полное сообщение:

 killed (program exited with code: 137) 

    3 Solutions collect form web for “Что означает «убитый»?”

    Код выхода 137 (128 + 9) указывает, что ваша программа вышла из-за приема сигнала 9, который является SIGKILL . Это также объясняет killed сообщение. Вопрос в том, почему вы получили этот сигнал?

    Вероятнее всего, причина в том, что ваш процесс пересек некоторый предел в количестве системных ресурсов, которые вам разрешено использовать. В зависимости от вашей ОС и конфигурации это может означать, что у вас слишком много открытых файлов, слишком много места для файлов или что-то еще. Скорее всего, ваша программа использует слишком много памяти. Вместо того, чтобы рисковать событиями, возникающими при сбое распределения памяти, система отправила сигнал уничтожения в процесс, в котором использовалось слишком много памяти.

    Как я уже отмечал ранее, одна причина, по которой вы могли бы поразить предел памяти после окончания печати, состоит в том, что ваш вызов counter.items() в вашем конечном цикле выделяет список, содержащий все ключи и значения из вашего словаря. Если в вашем словаре было много данных, это может быть очень большой список. Возможным решением было бы использовать counter.iteritems() который является генератором. Вместо того, чтобы возвращать все элементы в списке, он позволяет вам перебирать их с гораздо меньшим объемом использования памяти.

    Итак, я предлагаю попробовать это, как ваш последний цикл:

     for key, value in counter.iteritems(): writer.writerow([key, value]) 

    Обратите внимание, что в Python 3 items возвращают объект «словарь», который не имеет таких же накладных расходов, как версия Python 2. Он заменяет iteritems , поэтому, если вы позже обновите версии Python, вы в конечном итоге измените цикл так, как это было.

    Здесь задействованы две области хранения: стек и куча. Стек – это место, где сохраняется текущее состояние вызова метода (т.е. локальные переменные и ссылки), а куча – там, где хранятся объекты. рекурсия и память

    Я считаю, что в counter dict слишком много ключей, которые будут потреблять слишком много памяти о куче, поэтому время выполнения Python вызовет исключение OutOfMemory .

    Чтобы сохранить его, не создавайте гигантский объект, например счетчик .

    1.StackOverflow

    программа, которая создает слишком много локальных переменных.

     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

    программа, которая создает гигантский dict включает слишком много ключей.

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

    Рекомендации

    • 7. Память: стек против кучи
    • рекурсия и память

    Я сомневаюсь, что все убивает процесс только потому, что это занимает много времени. Погиб в общем случае означает, что что-то со стороны завершает процесс, но, вероятно, в этом случае не ударяет Ctrl-C, так как это приведет к выходу Python из исключения KeyboardInterrupt. Кроме того, в Python вы получите исключение MemoryError, если это проблема. Что может произойти, так это то, что вы нажимаете ошибку в коде Python или стандартной библиотеке, что приводит к сбою процесса.

    Python - лучший язык программирования в мире.