source

갑자기 멈추는 파이썬으로 거대한 CSV를 처리할 때 '킬드'는 무엇을 의미합니까?

ittop 2023. 7. 21. 21:58
반응형

갑자기 멈추는 파이썬으로 거대한 CSV를 처리할 때 '킬드'는 무엇을 의미합니까?

큰 CSV 파일을 가져온 다음 파일에 있는 각 단어의 발생 횟수를 센 다음 다른 CSV 파일로 내보내는 Python 스크립트가 있습니다.

하지만 지금 일어나고 있는 일은 일단 그 계산 부분이 끝나고 내보내기가 시작되면 다음과 같이 말합니다.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)

종료 코드 137(128+9)은 수신 신호 9로 인해 프로그램이 종료되었음을 나타냅니다.SIGKILL 이은또설다니합명한것▁the를 설명합니다.killed 를 받았느냐는 겁니다문제는, 왜 그 신호를 받았느냐는 것입니다.

가장 가능성이 높은 이유는 프로세스가 사용할 수 있는 시스템 리소스 양의 일부 제한을 초과했기 때문일 수 있습니다.OS 및 구성에 따라 열려 있는 파일이 너무 많거나 파일 시스템 공간을 너무 많이 사용한 것일 수 있습니다.프로그램에서 메모리를 너무 많이 사용했을 가능성이 가장 높습니다.시스템은 메모리 할당이 실패하기 시작할 때 깨질 위험을 감수하기보다는 메모리를 너무 많이 사용하는 프로세스에 킬 신호를 보냈습니다.

앞서 언급했듯이 인쇄 후 메모리 제한에 도달할 수 있는 한 가지 이유finished counting그것이 당신의 전화입니다.counter.items()마지막 루프에서 사전의 모든 키와 값을 포함하는 목록을 할당합니다.사전에 많은 데이터가 있는 경우 매우 큰 목록일 수 있습니다.은 가한해은다같습다니음과책을 사용하는 것입니다.counter.iteritems()그것은 발전기입니다.목록의 모든 항목을 반환하는 대신 메모리 사용량을 훨씬 줄이면서 항목을 반복할 수 있습니다.

그래서, 저는 이것을 당신의 마지막 루프로서, 당신의 마지막 루프로 제안합니다.

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

로 파이썬에서는 참로에 3서는파썬itemsPython 2 버전과 동일한 오버헤드가 없는 "사전 보기" 개체를 반환합니다.은 다니합체대를 합니다.iteritems따라서 나중에 Python 버전을 업그레이드하면 루프를 원래 상태로 다시 변경할 수 있습니다.

관련된 스토리지 영역은 스택과 힙의 두 가지입니다.스택은 메서드 호출의 현재 상태(즉, 로컬 변수 및 참조)가 유지되는 위치이고 힙은 개체가 저장되는 위치입니다.재귀와 기억

열쇠가 너무 많은 것 같습니다.counterdict는 힙 영역의 메모리를 너무 많이 소비하므로 Python 런타임은 OutOfMemory 예외를 발생시킵니다.

저장하려면 카운터와 같은 거대한 개체를 만들지 마십시오.

1.스택 오버플로

너무 많은 로컬 변수를 생성하는 프로그램

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.메모리 부족

거인을 창조하는 프로그램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

레퍼런스

대부분의 경우 메모리가 부족하여 커널이 프로세스를 종료했습니다.

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.

기본적으로:

공격 대상으로 선택된 PID 12216(total-vm의 +9Gb 사용으로 인해), soom_killer가 이를 받았습니다.

OOM 행동에 대한 기사가 있습니다.

시간이 오래 걸린다는 이유만으로 그 과정을 망치는 것은 아닌지 의심스럽습니다.일반적으로 킬드는 외부의 무언가가 프로세스를 종료했다는 것을 의미하지만, 이 경우 Python이 키보드에서 종료될 수 있기 때문에 Ctrl-C를 누르지 않을 수 있습니다.인터럽트 예외입니다.또한 Python에서 MemoryError 예외가 문제라면 발생할 수 있습니다.Python 또는 표준 라이브러리 코드에서 프로세스의 충돌을 일으키는 버그를 발견하는 경우가 발생할 수 있습니다.

공유 때 .VirtualBoxUbuntu 20.04 LTS입니다.은 Python으로 보석되었습니다.Killed내 개인 도서관을 로드하는 동안.폴더를 로컬 디렉터리로 이동했더니 문제가 사라졌습니다.다음과 같은 것으로 보입니다.Killed폴더를 이동한 후 누락된 라이브러리 메시지가 표시되어 라이브러리를 처음 가져오는 동안 중지가 발생했습니다.

컴퓨터를 다시 시작한 후 문제가 해결되었습니다.

따라서 프로그램이 어떤 종류의 공유를 초과하거나 OS를 재부팅해야 하는 일시적인 문제일 수 있는 경우 로컬 디렉터리로 프로그램을 이동하려고 할 수 있습니다.

언급URL : https://stackoverflow.com/questions/19189522/what-does-killed-mean-when-processing-a-huge-csv-with-python-which-suddenly-s

반응형