MemoryError (feat. ulimit)

J. Hwang·2024년 7월 17일

평소와 같이 서버에서 파이썬으로 대용량 카탈로그를 읽어오고 있었으나...

MemoryError: Unable to allocate 5.5GiB for an array with shape (11244258,)

위와 같은 에러가 뜨면서 카탈로그가 읽어지질 않았다.
메모리 에러에 대해 검색해보니 대부분이 파일 용량을 줄이거나 Jupyter Notebook을 사용한다면 configuration을 수정해서

c.NotebookApp.max_buffer_size = 1000000000000000000

과 같이 max buffer size를 늘리는 해결방안을 제시했다.
그러나 먹히지 않았고...무엇보다 원래는 잘 되던 것이 갑자기 안 되는 것이 이상했다.

그러다 bashrc를 살펴보니 왠지 모르게 ulimit -v 10495986 가 추가되어 있었다.
ulimit은 리눅스에서 프로세스가 사용하는 자원을 관리하는 명령어이다. -v 옵션은 virtual memory를 의미하는데 터미널에서 $ ulimit -a로 확인해보니

virtual memory                  (kbytes, -v) 10495986

와 같이 되어 있었다. 이는 virtual memory가 10495986 킬로바이트, 즉 ~10 GB로 제한되어 있다는 의미였다. 이 때문에 대용량 카탈로그를 읽을 수 없었던 것이다. 이 문제를 해결하기 위해서 아래와 같은 과정을 거쳤다:

먼저 bashrc에 입력되어 있는 ulimit -v 10495986를 삭제하거나 주석 처리하고 source ~/.bashrc를 통해 bashrc 변경 사항을 적용시킨다.
이후 터미널에 아래 명령어를 입력해서 virtual memory를 unlimited로 설정해 제한을 풀어준다.

$ ulimit -v unlimited

제대로 변경되었는지 확인하려면 다시 터미널에 $ ulimit -a를 입력해서

virtual memory                  (kbytes, -v) unlimited

과 같이 설정되었는지 보면 된다.


※ bashrc를 건드리지 않았는데 도대체 어쩌다가 ulimit 제한이 걸린 것인지 모르겠다. 해킹은 아니겠지...? 패스워드를 자주 변경해야겠다.
※ 다만 나의 경우 $ ulimit -v unlimited 했을 때

bash: ulimit: vitual memory: cannot modify limit: Operation not permitted

와 같은 에러 메시지가 떴다. 권한 문제라는 생각이 들어서 관리자 계정에 부탁했는데 관리자 계정으로 하면 확실히 해결되는 것인지는 불명.

※ 만약 vnc 상에서 이 작업을 하고 있다면 변화가 바로 적용되지 않을 수 있다. 그럴 때는 vnc kill한 후 새로 생성해서 변화가 적용되었는지 확인해보자.


p.s. 이 골치아픈 문제를 함께 해결해주신 김 박사님께 감사드립니다...!


References

https://sysops.tistory.com/99
https://stackoverflow.com/questions/29960676/how-to-increase-virtual-memory-for-each-one-on-linux-command-line

profile
Let it code

0개의 댓글