Подтвердить что ты не робот

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

У меня есть Python script, который импортирует большой CSV файл и затем подсчитывает количество вхождений каждого слова в файл, а затем экспортирует counts в другой 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)
4b9b3361

Ответ 1

Код выхода 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, вы в конечном итоге измените цикл так, как это было.

Ответ 2

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

Я думаю, что в 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

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

Ответ 3

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