Python 프로그램이 갑자기 종료되었습니다.

Python 프로그램이 갑자기 종료되었습니다.

저는 꽤 무거운 Python 프로그램을 실행하고 있습니다. 저는 이 스크립트를 몇 주 동안 실행했지만 지난 며칠 동안 다음 메시지와 함께 프로그램이 종료되었습니다.

Killed

나는 노력했다새 스왑 파일 만들기8GB이지만 이런 일이 항상 발생합니다.

나는 또한 다음을 사용해 보았습니다.

dmesg -T| grep -E -i -B100 'killed process'

오류 목록은 다음과 같습니다.

[Sat Oct 17 02:08:41 2020] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/[email protected],task=python,pid=56849,uid=1000
[Sat Oct 17 02:08:41 2020] Out of memory: Killed process 56849 (python) total-vm:21719376kB, anon-rss:14311012kB, file-rss:0kB, shmem-rss:4kB, UID:1000 pgtables:40572kB oom_score_adj:0

나는 강력한 컴퓨터를 가지고 있으며 다른 것(Pycharm 또는 터미널)을 실행하지 않고 실행해 보았지만 계속 발생합니다.

안경:

  • 우분투 20.04 LTS(64비트)
  • 15.4GiB 메모리
  • 인텔 코어 i7-105100 CPU @ 1.80GHz x 8

달리는 동안free -h t

             total        used        free      shared  buff/cache   available
Mem:           15Gi       2.4Gi        10Gi       313Mi       2.0Gi        12Gi
Swap:         8.0Gi       1.0Gi       7.0Gi

답변1

여기서는 할 일이 별로 없어서 아쉽네요. 해당 프로세스는 시스템이 충돌하기 전에 너무 많은 메모리를 차지하는 작업을 죽이는 작업을 수행하는 운영 체제 프로세스인 OOM 킬러(Out of Memory Killer)에 의해 종료되고 있습니다. 이것은 좋은 일입니다. 그렇지 않으면 컴퓨터가 응답하지 않게 됩니다.

따라서 Python 스크립트가 왜 그렇게 많은 메모리를 차지하고 있는지 파악하고 메모리를 덜 사용하도록 노력해야 합니다.

유일한 다른 옵션은 더 많은 스왑 공간이나 더 많은 RAM을 확보하는 것이지만 이는 반창고처럼 느껴집니다. 이것이 Python 스크립트인 경우 메모리 소비를 최소화해야 합니다.

답변2

프로그램을 장기간 실행할수록 버퍼 메모리가 증가할 수 있습니다. 아래의 가비지 컬렉션 기능을 이용하여 버퍼 메모리를 정리할 수 있습니다. 또한 필요한 경우 gc.collect()를 추가할 수 있습니다.

 import gc

 gc.collect()

답변3

비슷한 문제가 있습니다. matplotlib 플롯 파일을 생성하기 위해 몇 분 동안 실행되는 Python 스크립트가 있습니다. Python script.py를 통해 명령줄에서 직접 스크립트를 실행하면 모든 것이 잘 작동합니다. bash 스크립트에서 실행하면 시간이 지남에 따라 메모리 사용량이 증가하고 결국 위와 동일한 종료 메시지와 함께 중지됩니다. 아직 해결책을 찾지 못했지만 이것이 미래에 누군가에게 도움이 되기를 바랍니다.

답변4

Instagram 개발자의 방법을 읽었습니다.가비지 수집을 완전히 비활성화합니다..

그 이유는 프로세스가 하위 프로세스를 생성하면 메모리를 공유하지만 메모리 페이지가 변경되면 새 프로세스가 복사되어 RAM 사용량이 증가하기 때문입니다.

따라서 메모리를 삭제하기 전에 세대를 저장하지 않도록 가비지 수집을 비활성화하면 RAM 사용량을 줄이는 데 도움이 됩니다. 참조 횟수가 0에 도달하면 gc가 실제로 비활성화되지 않고 해당 값에 도달할 때까지 기다릴 임계값이 없기 때문입니다.

이는 임계값을 로 설정하여 수행할 수 있습니다 0.

import gc
gc.set_threshold(0)

관련 정보