Metatrader 5 - 기호를 통해 차트를 순환할 때 많은 메모리를 사용합니다. - 페이지 4

 
Carl Schreiber :

TerminalInfoIntegerTERMINAL_MAXBARS 를 설정하려고 했습니까? (..) 합리적인 작은 값으로?

그 외에도 다음이 있습니다.

TERMINAL_MEMORY_PHYSICAL

시스템의 물리적 메모리, Mb

정수

TERMINAL_MEMORY_TOTAL

터미널의 프로세스에 사용 가능한 메모리, Mb

정수

TERMINAL_MEMORY_AVAILABLE

터미널 프로세스의 여유 메모리, Mb

정수

TERMINAL_MEMORY_USED

터미널에서 사용하는 메모리 , Mb

정수


문제의 핵심이 어디에 있는지 확인합니다.

TERMINAL_MAXBARS를 500(정말 낮음)으로 설정했지만 여전히 더 많은 막대를 로드하고 있으며(파일에서 가져온다고 상상해 보세요?) 메모리가 계속 증가하고 있습니다.

위에 나열된 메모리 카운터를 기록하기 시작하면 이에 대한 피드백이 곧 있을 것입니다.

좋아, 피드백을 받았고 조금 이상해 보입니다. 아래는 두 개의 로그 "MetaTrader Log" 및 "PowerShell Log"이며 메모리 사용량을 기록하는 두 개의 로그입니다. (PowerShell 스크립트는 이 스레드의 앞부분에 있으며 작업 관리자에 있는 내용과 일치하도록 업데이트했습니다.) 이 두 로그는 모두 내가 마지막으로 실행한 처음이자 마지막입니다.

가볼만한 곳:

  1. TERMINAL_MEMORY_PHYSICAL 및 TERMINAL_MEMORY_TOTAL은 동일하게 유지됩니다. 이 값은 로그를 통해 모든 행에서 동일합니다.
  2. TERMINAL_MEMORY_AVAILABLE이 13902 에서 13806 으로 감소했습니다.
  3. TERMINAL_MEMORY_USED가 432 에서 528 로 증가했습니다.
  4. 시스템에서 사용하는 킬로바이트 수는 테스트 기간 동안 시작 시 128,300K(128.3Mb ) 에서 최대 215,488K(215.488Mb)로 증가했습니다.

##### 메타 트레이더 로그
##### 이것은 Metatrader의 내 로거에 의해 기록되었습니다. 모든 메모리를 출력합니다.

시각 TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMORY_TOTAL TERMINAL_MEMORY_AVAILABLE TERMINAL_MEMORY_USED
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShell 로그
#### 이것은 PowerShell 스크립트에 의해 기록되었습니다.

2016년 4월 29일 17:31:32 킬로바이트 사용 128 300K
2016년 4월 29일 18:05:08 사용 중인 킬로바이트 215 488K

 
gr101 :

TERMINAL_MAXBARS를 500(정말 낮음)으로 설정했지만 여전히 더 많은 막대를 로드하고 있으며(파일에서 가져온다고 상상해 보세요?) 메모리가 계속 증가하고 있습니다.

위에 나열된 메모리 카운터를 기록하기 시작하면 이에 대한 피드백이 곧 있을 것입니다.

좋아, 피드백을 받았고 조금 이상해 보입니다. 아래는 두 개의 로그 "MetaTrader Log" 및 "PowerShell Log"이며 메모리 사용량을 기록하는 두 개의 로그입니다. (PowerShell 스크립트는 이 스레드의 앞부분에 있으며 작업 관리자에 있는 내용과 일치하도록 업데이트했습니다.) 이 두 로그는 모두 내가 마지막으로 실행한 처음이자 마지막입니다.

가볼만한 곳:

  1. TERMINAL_MEMORY_PHYSICAL 및 TERMINAL_MEMORY_TOTAL은 동일하게 유지됩니다. 이 값은 로그를 통해 모든 행에서 동일합니다.
  2. TERMINAL_MEMORY_AVAILABLE이 13902 에서 13806 으로 감소했습니다.
  3. TERMINAL_MEMORY_USED가 432 에서 528 로 증가했습니다.
  4. 시스템에서 사용하는 킬로바이트 수는 테스트 기간 동안 시작 시 128,300K(128.3Mb ) 에서 최대 215,488K(215.488Mb)로 증가했습니다.

##### 메타 트레이더 로그
##### 이것은 Metatrader의 내 로거에 의해 기록되었습니다. 모든 메모리를 출력합니다.

시각 TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMORY_TOTAL TERMINAL_MEMORY_AVAILABLE TERMINAL_MEMORY_USED
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### PowerShell 로그
#### 이것은 PowerShell 스크립트에 의해 기록되었습니다.

2016년 4월 29일 17:31:32 킬로바이트 사용 128 300K
2016년 4월 29일 18:05:08 사용 중인 킬로바이트 215 488K

나(노트북, 8GB 램, Win7-64)는 4개의 mt4 각각에 대해 동일한 램 사용량을 가지고 있습니다.

걱정하실 일은 아닌 것 같아요!

몇 GB가 아직 무료/사용 가능합니까?

 
Carl Schreiber :

나(노트북, 8GB 램, Win7-64)는 4개의 mt4 각각에 대해 동일한 램 사용량을 가지고 있습니다.

걱정하실 일은 아닌 것 같아요!

몇 GB가 아직 무료/사용 가능합니까?

그래프에서 위의 수준에 RAM이 많이 있습니다. 문제는 실행 상태로 두면 RAM 사용량이 천천히 증가한다는 것입니다.

따라서 약 1-2시간 후에 최대치에 도달하기 시작합니다.

저는 현재 Server 2012, 7GB RAM, 4코어(무엇인지 확실하지 않음), 64비트에서 EA를 실행하고 있습니다.

 
gr101 :

그래프에서 위의 수준에 RAM이 많이 있습니다. 문제는 실행 상태로 두면 RAM 사용량이 천천히 증가한다는 것입니다.

따라서 약 1-2시간 후에 최대치에 도달하기 시작합니다.

저는 현재 Server 2012, 7GB RAM, 4코어(무엇인지 확실하지 않음), 64비트에서 EA를 실행하고 있습니다.

기억에 최대한 많이 남기는 것이 Win-Server의 특징인 것 같다는 것을 한 번 배웠습니다.

정기적으로 터미널을 다시 시작했지만 이것이 충돌을 일으킬지 여부가 궁금합니다!

 
Carl Schreiber :

기억에 최대한 많이 남기는 것이 Win-Server의 특징인 것 같다는 것을 한 번 배웠습니다.

정기적으로 터미널을 다시 시작했지만 이것이 충돌을 일으킬지 여부가 궁금합니다!

흥미롭긴 하지만... Market Watch 안팎으로 기호를 로드하는 것과 관련이 있는 것 같습니다.

터미널이 충돌하지 않고 정말 느리게, 사용할 수 없을 정도로 느리게 실행되기 시작합니다.

 
gr101 :

흥미롭긴 하지만... Market Watch 안팎으로 기호를 로드하는 것과 관련이 있는 것 같습니다.

터미널이 충돌하지 않고 정말 느리게, 사용할 수 없을 정도로 느리게 실행되기 시작합니다.

이것을 어떻게 확인 합니까? 아마도 서버가 그래픽을 위한 빠른 시스템이 아니라 빠른 수학으로 설정되었을 수 있습니다. 계산 및 빠른 웹 응답?
 

Server 2012의 표준 설치입니다. 그러나 제 이론은 설치 방법은 중요하지 않다는 것입니다. 메모리 누수는 시간이 지남에 따라 항상 시스템의 모든 공간을 차지합니다.

따라서 상자가 얼마나 빠르거나 얼마나 많은 RAM이 있는지는 중요하지 않습니다. 누출이 있으면 어느 시점에서 한계에 도달하게 됩니다.

 

이 주제에 대해 2센트를 기부하는 것뿐입니다.

여기에 메모리 누수 및 증가에 대한 좋은 아이디어가 많이 있지만 주제와 근본 원인과 관련하여 제 고려 사항은 다음과 같습니다.

- 게시된 소스 코드는 예를 들어 SymbolSelect() 반환과 같은 여러 관련 함수 반환을 확인하지 않습니다.

- SymbolsTotal()과 같은 함수 반환을 기반으로 하는 for/while 루프에는 일부 잘못된 값 함수 반환에 대한 제한이나 보호가 있을 수 있습니다.

코드를 스트레스/변경하고 다시 테스트하면 문제의 근본 원인을 찾아 해결할 수 있습니다.

 

많은 함수 호출이 반환되지 않으면 할당된 메모리가 해제되지 않는 경우 Rogerio Figurelli 가 맞다고 생각합니다.

스택 오버플로 오류가 발생하는지 확인하기 위해 stacksize를 줄일 수 있습니다.

스택

모든 MQL4 프로그램에는 자동으로 생성되는 로컬 함수 변수를 저장하기 위해 스택이라는 특수 메모리 영역이 할당됩니다. 모든 기능에 대해 하나의 스택이 할당됩니다. 기본 스택 크기는 256kb이며 스택 크기는 #property stacksize 컴파일러 지시문을 사용하여 관리할 수 있습니다.

정적 로컬 변수는 다른 정적 및 전역 변수가 저장되는 동일한 위치, 즉 스택과 별도로 존재하는 특수 메모리 영역에 저장됩니다. 동적 으로 생성된 변수는 스택과 별도의 메모리 영역도 사용합니다.

각 함수 호출과 함께 스택의 한 위치는 내부 비정적 변수에 할당 됩니다. 기능을 종료한 후 메모리를 다시 사용할 수 있습니다.

첫 번째 함수에서 두 번째 함수가 호출되면 두 번째 함수는 해당 변수에 대해 나머지 스택 메모리에서 필요한 크기를 차지합니다. 따라서 포함된 기능을 사용할 때 스택 메모리는 각 기능에 대해 순차적으로 점유됩니다. 이로 인해 함수 호출 중 하나에서 메모리 부족이 발생할 수 있으며 이러한 상황을 스택 오버플로라고 합니다.

따라서 대용량 로컬 데이터의 경우 동적 메모리를 더 잘 사용해야 합니다. 함수를 입력할 때 로컬 요구에 필요한 메모리를 시스템에 할당( new , ArrayResize() )하고 함수를 종료할 때 메모리를 해제( 삭제 , ArrayFree() ).

또한보십시오

데이터 유형 , 유형의 캡슐화 및 확장성 , 변수 초기화 , 가시성 범위 및 변수 수명 , 객체 생성 및 삭제

Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
  • docs.mql4.com
Program Properties (#property) - Preprocessor - Language Basics - MQL4 Reference
 

좋은 점.

언젠가 이것을 시도하고 결과와 함께 여기에 피드백을 줄 것입니다.

감사해요

사유: