programing

VBA에서 "메모리 부족 오류"를 방지하기 위해 메모리를 지우는 방법은 무엇입니까?

kakaobank 2023. 4. 27. 22:37
반응형

VBA에서 "메모리 부족 오류"를 방지하기 위해 메모리를 지우는 방법은 무엇입니까?

대형 Excel 스프레드시트에서 VBA 코드를 실행하고 있습니다.절차/통화 사이의 메모리를 삭제하여 "메모리 부족" 문제가 발생하지 않도록 하려면 어떻게 해야 합니까?

메모리를 해제하는 가장 좋은 방법은 큰 개체를 무효화하는 것입니다.

Sub Whatever()
    Dim someLargeObject as SomeObject

    'expensive computation

    Set someLargeObject = Nothing
End Sub

또한 글로벌 변수는 한 호출에서 다른 호출로 계속 할당되므로 지속성이 필요하지 않은 경우 글로벌 변수를 사용하지 않거나 더 이상 필요하지 않을 때 이 변수를 무효화해야 합니다.

그러나 다음과 같은 경우에는 도움이 되지 않습니다.

  • 절차가 끝나면 개체가 필요합니다(계속).
  • 개체가 메모리에 맞지 않습니다.

또 다른 가능성은 충돌하기 전에 더 많은 RAM을 사용할 수 있는 64비트 버전의 Excel로 전환하는 것입니다(32비트 버전은 일반적으로 약 1.3으로 제한됨).GB).

해결책을 찾았습니다.처음에는 더 많은 시간이 걸릴 것 같았지만, 스와핑 횟수가 줄어들고 메모리를 더 많이 사용할 수 있기 때문에 모든 작업이 보다 원활하고 빠르게 진행됩니다.이것은 과학적인 접근법이 아니며 작동하기 전에 몇 가지 테스트가 필요합니다.

코드에서 Excel이 가끔 워크북을 저장하도록 합니다.36만 줄로 된 시트를 반복해야 했고 심하게 질식했습니다.매 10,000마다 코드를 워크북에 저장하도록 만들었고 이제는 32비트 엑셀에서도 매력적으로 작동합니다.

작업 관리자를 동시에 시작하면 저장할 때마다 메모리 사용률이 급격히 감소하는 것을 볼 수 있습니다.

대답은 명확하게 할 수 없지만 일상에서 메모리를 확보해야 한다는 것입니다.

하지만 기억을 돕기 위한 몇 가지 팁들.

  • 루틴을 종료하기 전에 개체를 null로 설정해야 합니다.
  • 개체에 필요한 경우 닫기를 호출해야 합니다.
  • 꼭 필요한 경우가 아니면 전역 변수를 사용하지 않음

루틴을 반복한 후 메모리 사용량을 확인하는 것이 좋습니다. 메모리 누수가 발생할 수 있습니다.

내 문제에 대한 해결책을 찾고 있는 이 스레드를 찾았습니다.제 것은 다른 사람들에게 도움이 될 수 있는 다른 해결책이 필요했습니다.매크로는 행을 삭제하고, 위로 이동하고, 행을 다른 워크시트에 복사하는 중이었습니다.메모리 사용량이 몇 기가바이트로 폭발적으로 증가하여 약 4,000개의 레코드만 처리한 후 "메모리 부족"이 발생했습니다.무엇이 나를 위해 그것을 해결했나요?

application.screen 업데이트 = false

코드를 시작할 때(마지막에 다시 사실로 만드십시오.) 그렇게 하면 실행 속도가 빨라질 것이라는 것을 알았고, 그렇게 했습니다.하지만 기억에 대해서는 전혀 몰랐습니다.

이렇게 작게 변경한 후에도 메모리 사용량이 135MB를 초과하지 않았습니다.그게 왜 효과가 있었습니까?정말 모르겠어요.하지만 그것은 시도할 가치가 있고 당신에게 적용될 수도 있습니다.

대규모 데이터 세트에서 작업하는 경우 어레이가 사용될 가능성이 매우 높습니다.제가 500,000 행과 30 열 워크시트에서 몇 개의 배열을 생성하는 것이 이 오류를 일으켰습니다.저는 다른 어레이를 만들기 전에 더 이상 필요하지 않은 어레이를 제거하기 위해 아래 라인을 사용하여 간단히 해결했습니다.

Erase vArray

또한 30개 중 2개의 열만 사용하는 경우에는 30개의 열이 있는 열 대신 2개의 1개의 열 배열을 만드는 것이 좋습니다.속도에는 영향을 주지 않지만 메모리 사용량에는 차이가 있을 것입니다.

나도 비슷한 문제가 있어서 스스로 해결했습니다.부분적으로 너무 많은 "큰 것"들이 있는 동안 너무 많은 메모리를 차지하는 것이 제 코드였다고 생각합니다.

제 신청서에서 - 워크북이 나가서 다른 부서의 "일상 보고서"를 가져옵니다.실수와 데이터 입력을 최소화하기 위해 팀에 필요한 모든 정보를 추출합니다.

침대 시트를 직접 당겨서...하지만 그들이 병합된 세포를 사용한다는 사실이 싫어요제거합니다(즉, 병합한 다음 결과 빈 셀을 찾고 위의 값으로 채웁니다.

나는 내 문제를 해결했습니다.

단순히 전체 열을 수행하려는 것이 아니라 "사용된 셀"만 병합합니다.ie 열에서 마지막으로 사용한 행을 찾고 이 범위만 병합합니다(내가 잡은 각 시트에는 말 그대로 1000개의 행이 있습니다).

실행 취소는 마지막 ~16개 이벤트만 확인합니다.각각의 "unmerge" 사이에 - 나는 보류된 메모리 양을 최소화하기 위해 "member"에 저장된 것을 지우는 15개의 이벤트를 넣었습니다(즉, 데이터가 있는 어떤 셀로 이동합니다).특수 값 복사/붙여넣기...나는 각각 3열 분량의 데이터가 있는 30장의 누적 합계가 실행 취소를 위한 측면으로 설정된 메모리에 세금을 부과하는 것일 수 있다고 추측했습니다.

네, 실행 취소의 가능성을 허용하지 않습니다...하지만 전체적인 목적은 오래된 정보를 삭제하고 분석을 위해 새로운 시간에 민감한 데이터를 가져와 문제가 되지 않도록 하는 것입니다.

진부하게 들리지만 내 문제는 사라졌습니다.

나중에 프로그램에서 사용되는 변수를 초기화하여 이 오류를 해결할 수 있었습니다.그 당시 저는 클래스/모듈에서 옵션 명시적을 사용하지 않았습니다.

언급URL : https://stackoverflow.com/questions/14396998/how-to-clear-memory-to-prevent-out-of-memory-error-in-vba

반응형