Programing/Error Resolution(오류해결)

코딩 일기 : 파이썬 SbOX_FATAL_MEMORY_EXCEEDED 오류 해결 방법!

세기루민 2020. 11. 18. 10:50
728x90

어제 2차 컨펌 후 개발은 그대로 진행하면서 

 

새로운 프로젝트가 추가되었다....

 

하하..... 실화니?....

 

무튼 그 내용은 자세하게 공개 할 수 없으나 

 

결론적으로 공공데이터포털의 api를 이용해야 한다는 점!

 

처음에 CSV나 Excel로 제공해 줄 것이라는 큰 기대를 가지고 대기했는데?...

 

갑자기 담당자분도 잘 모르겠다면서 사이트를 나에게 알려줬다.

 

나란 남자.... 그래도 해야겠지?...ㅎㅎ

 

무튼 그날 집에가서 밤을 새면서 코딩 한 후 확인했더니 잘 됬다.

 

내 노트북을 들고 출근해서 코딩을 하다가 선생님과 컨펌도 하고 좋게 진행되는 듯 했으나...

 

 

SbOX_FATAL_MEMORY_EXCEEDED

 

메모리 폭파....ㄷㄷ

 

처음에 문제가 뭘지 고민하다가 코드 자체가 아에 안열린다..ㄷㄷ

 

나란녀석의 해결 방법은 무엇일까?

 

Atom을 이용해서 직접 데이터를 제거해줬다..

 

아톰을 이용해서 코드를 열면 마치 XML 형식으로 코드가 나열되고

 

여기서 코드 흐름만 알 수 있다면 수정이 가능했다.

 

내가 했던 실수는 print였다.

 

이유는?

 

print를 너무 많이 사용했기 때문에 많은 데이터가 필요없는 공간에 저장되었다는 점!

 

반복문을 돌릴 때 print로 확인을 했었는데 이를 지우지 않고 그대로 냅뒀다.

 

하... 이런 사소한 실수들이 결국 큰 문제를 만들어 낸다.

 

그래서 직접 지워줬다.

 

print를 할 때 크기가 적은 변수들은 괜찮지만 데이터가 엄청 많은 경우 메모리가 초과되고 

 

용량도 많이 잡아먹는다.

 

예시로 직접 오류났다고 판단한 부분

for i in range(1, 1000):
    pageNo = i;
    jsonData = getContractinformationList17(inqryDiv,numOfRows,pageNo,ver)
    print(jsonData)

 내가 발생했던 문제로는 우선 range(1, 1000)인데 

 

함수에 대한 모든 데이터를 출력했고 이를 json에 저장했다는 멍청한 짓이였다.

 

여기서 크기를 조정하고 print를 제거했더니 메모리 폭파의 오류를 해결했다.

{"response": {
  "header": {
    "resultCode": "00",
    "resultMsg": "정상"
  },
  "body": {
    "items": [
      {
        "untyCntrctNo": "보안상혹시몰라서비밀값",
        "bsnsDivNm": "보안상혹시몰라서비밀값",
        "dcsnCntrctNo": "보안상혹시몰라서비밀값",
        "cntrctRefNo": "보안상혹시몰라서비밀값",
        "cntrctNm": "보안상혹시몰라서비밀값",
        "cmmnCntrctYn": "보안상혹시몰라서비밀값",
        "lngtrmCtnuDivNm": "보안상혹시몰라서비밀값",
        "cntrctCnclsDate": "보안상혹시몰라서비밀값",
        "cntrctPrd": "보안상혹시몰라서비밀값",
        "baseLawNm": "보안상혹시몰라서비밀값",
        "totCntrctAmt": "보안상혹시몰라서비밀값",
        "thtmCntrctAmt": "보안상혹시몰라서비밀값",
        "grntymnyRate": "보안상혹시몰라서비밀값",
        "cntrctInfoUrl": "보안상혹시몰라서비밀값",
        "payDivNm": "보안상혹시몰라서비밀값",
        "reqNo": "보안상혹시몰라서비밀값",
        "ntceNo": "보안상혹시몰라서비밀값",
        "cntrctInsttCd": "보안상혹시몰라서비밀값",
        "cntrctInsttNm": "보안상혹시몰라서비밀값",
        "cntrctInsttJrsdctnDivNm": "보안상혹시몰라서비밀값",
        "cntrctInsttChrgDeptNm": "보안상혹시몰라서비밀값",
        "cntrctInsttOfclNm": "보안상혹시몰라서비밀값",
        "cntrctInsttOfclTelNo": "보안상혹시몰라서비밀값",
        "cntrctInsttOfclFaxNo": "보안상혹시몰라서비밀값",
        "dminsttList": "보안상혹시몰라서비밀값",
        "corpList": "보안상혹시몰라서비밀값",
        "cntrctDtlInfoUrl": "보안상혹시몰라서비밀값",
        "crdtrNm": "보안상혹시몰라서비밀값",
        "baseDtls": "보안상혹시몰라서비밀값",
        "cntrctCnclsMthdNm": "보안상혹시몰라서비밀값",
        "rgstDt": "보안상혹시몰라서비밀값",
        "chgDt": "보안상혹시몰라서비밀값",
        "dfrcmpnstRt": "보안상혹시몰라서비밀값",
        "linkInsttNm": "보안상혹시몰라서비밀값",
        "d2bMngCntrctSttusNm": "보안상혹시몰라서비밀값",
        "d2bMngPrearngAmt": "보안상혹시몰라서비밀값",
        "d2bMngBidMthdNm": "보안상혹시몰라서비밀값",
        "d2bMngDcsnNo": "보안상혹시몰라서비밀값"
      },
      .
      .
      .
      .
      .
      .
      .
      .

 

대략 이런 느낌으로 출력 완성!

 

사실 데이터는 나왔는데...ㅠㅠ 보안상 걱정되서 비밀값으로 작성했습니다 ㅠㅠ 

 

무튼 이렇게 메모리 문제는 해결 ㅎㅎ

 


SbOX_FATAL_MEMORY_EXCEEDED 에러처럼

  

메모리 문제에서 가장 중요하게 봐야할 점을 정리했습니다.

 

 

1. print 및 필요없는 출력을 하는 경우

2. 본인 PC의 성능을 고려하지 않은 데이터 호출

3. 무분별한 캐시 사용 및 캐시 정리를 안한 경우

4. 다중으로 프로그램을 이용하는 경우

 

위와 같은 경우 개인 pc 성능이 엄청 좋다면 문제가 되지 않지만 

 

대부분 이런 사소한 습관으로 코드를 날릴 수 있는 사태가 발생한다.

 

메모리 부족 문제가 발생했을 때 위의 4가지를 한번 확인하면서 

 

오류를 해결하는 능력을 길러보자!

728x90