[질의] perl에서 메모리관리,,,
perl로 프로그램을 작성하고 있는데...
메모리 관련 질의가 있습니다.
perl로 작성하는 프로그램은 특정 서열을 갖고 여러 DB들과 비교(blast)를 하는데
1개 DB와 blast를 할때
메모리 사용량이 다음과 같습니다.
[root@newGGC23 jjuns]# cat /proc/meminfo
MemTotal: 6235052 kB
MemFree: 3653228 kB
Buffers: 57352 kB
Cached: 2349480 kB
SwapCached: 0 kB
Active: 1754348 kB
Inactive: 783964 kB
HighTotal: 5373888 kB
HighFree: 2878900 kB
LowTotal: 861164 kB
LowFree: 774328 kB
SwapTotal: 6144820 kB
SwapFree: 6144820 kB
Dirty: 56 kB
Writeback: 0 kB
AnonPages: 131492 kB
Mapped: 1368108 kB
Slab: 25444 kB
PageTables: 7268 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 9262344 kB
Committed_AS: 349148 kB
VmallocTotal: 116728 kB
VmallocUsed: 5860 kB
VmallocChunk: 110828 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
1개 DB당 blast시에 사용한 메모리가 해제가 되었으면 좋겠는데
해제가 되지않아 최종결과를 위해 사용하는 프로그램이
메모리 3G가 확보가 되어야 하는데 메모리 부족으로 프로그램이 정상종료가 되지 않습니다.
그래서 blast 1회 끝날 때마다 메모리 회수와 관련된 코드를 넣고 싶은데
어찌 해결을 해야할 까요...
제가 프로그램 코드상에서 직접 메모리할당을 하는 것이 아니여서
특정 프로세스가 종료되면 종료후 프로세스가 갖고있던 메모리를 회수하고 싶습니다.
방법을 좀 알려주세요
blast를 사용하시는
blast를 사용하시는 것을 보니 생물학쪽 일을 하시나 보군요.
아무래도 정확한 코드와 blast쪽 모듈이 어떻게 동작하는지
정확하게 알지 못해서 해답을 드리기는 어렵겠습니다만,
기본적인 부분은 다음과 같습니다. 사용할 수 있는 변수는
최대한 my를 이용한 렉시컬 변수를 사용하고
해당 변수를 사용해야 하는 경우에 my로 선언후 사용을 시작합니다.
이렇게 작성하는 경우 객체든 데이터든 해당 범위(scope)를 벗어나면,
Perl이 레퍼런스 카운트를 감소시키면서 자동으로 메모리를
해제하기 때문에 메모리 부족 문제를 조금이나마 덜 수 있지 않을까 합니다.
물론 더 정확하게 말하면 Perl에서는 렉시컬 변수의 범위가 끝난다고
할당한 메모리를 바로 반환하지 않고 효율성을 위해 여전히 Perl이 물고는 있지만,
어짜피 빈 영역이니까 메모리를 절약할 수 있는 방법임에는 변함이 없답니다.
더 근본적인 문제를 해결하기 위해 어느 부분이 메모리를 반환하지 않아
메모리 부족 문제가 생기는지 부터 파악을 해야
자세한 도움을 드릴 수 있을 것 같네요. :-)
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Keedi Kim
----
use perl;
Keedi Kim
댓글 달기