У меня есть сценарий Python, который импортирует большой файл CSV, а затем подсчитывает количество вхождений каждого слова в файле, а затем экспортирует счетчики в другой файл CSV.
Но происходит следующее: как только счетная часть завершается и начинается экспорт, это отображается Killed
в терминале.
Я не думаю, что это проблема с памятью (если бы это было так, я предполагаю, что получил бы ошибку памяти, а не 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)
killed
пришло сообщение, но если это связано с превышением какого-то ограничения системной памяти, вы можете исправить это, используяcounter.iteritems()
вместо этогоcounter.items()
в своем последнем цикле. В Python 2items
возвращает список ключей и значений в словаре, для которого может потребоваться много памяти, если он очень большой. Напротив,iteritems
это генератор, которому в любой момент времени требуется только небольшой объем памяти.Ответы:
Код выхода 137 (128 + 9) указывает, что ваша программа завершилась из-за приема сигнала 9, который есть
SIGKILL
. Это также объясняетkilled
сообщение. Вопрос в том, почему вы получили этот сигнал?Скорее всего, причина в том, что ваш процесс преодолел некоторый предел количества системных ресурсов, которые вам разрешено использовать. В зависимости от вашей ОС и конфигурации это может означать, что у вас было слишком много открытых файлов, использовалось слишком много места в файловой системе или что-то еще. Скорее всего, ваша программа использовала слишком много памяти. Вместо того, чтобы рисковать, что что-то сломается, когда выделение памяти начало давать сбой, система отправила сигнал уничтожения процессу, который использовал слишком много памяти.
Как я прокомментировал ранее, одна из причин, по которой вы можете достичь ограничения памяти после печати,
finished counting
заключается в том, что ваш вызов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
Ссылки
источник
Я сомневаюсь, что что-то убивает процесс только потому, что он занимает много времени. Killed обычно означает, что что-то извне завершило процесс, но, вероятно, не в этом случае нажатие Ctrl-C, так как это приведет к завершению Python при исключении KeyboardInterrupt. Кроме того, в Python вы получите исключение MemoryError, если это проблема. Возможно, вы столкнулись с ошибкой в коде Python или стандартной библиотеки, которая вызывает сбой процесса.
источник
SIGKILL
, если Pythonraise(SIGKILL)
по какой-либо причине не имеет где-то в своем коде.Скорее всего, у вас закончилась память, поэтому ядро убило ваш процесс.
Вы слышали об OOM Killer ?
Вот журнал сценария, который я разработал для обработки огромного набора данных из файлов 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
Это было взято из
/var/log/syslog
.В принципе:
Вот статья о поведении OOM .
источник
То же самое случилось со мной, когда я попытался запустить скрипт python из общей папки в
VirtualBox
новом Ubuntu 20.04 LTS. Python отказался отKilled
загрузки моей личной библиотеки. Когда я переместил папку в локальный каталог, проблема исчезла. Похоже, чтоKilled
остановка произошла во время первоначального импорта моей библиотеки, поскольку я получил сообщения об отсутствующих библиотеках после того, как переместил папку.Проблема исчезла после того, как я перезапустил свой компьютер.
Следовательно, люди могут захотеть попробовать переместить программу в локальный каталог, если он превышает какой-либо общий ресурс или это может быть временная проблема, требующая просто перезагрузки ОС.
источник