Metatrader 5 - Tira muito proveito da memória ao percorrer uma carta através de símbolos - página 4

 
Carl Schreiber:

Você já tentou setTERMINAL_MAXBARScom TerminalInfoInteger(...) a um valor razoavelmente pequeno?

Além disso, você já tentou:

TERMINAL_MEMORY_PHYSICAL

Memória física no sistema, Mb

int

TERMINAL_MEMÓRIA_TOTAL

Memória disponível para o processo do terminal , Mb

int

TERMINAL_MEMÓRIA_DISPONÍVEL

Memória livre do processo terminal, Mb

int

TERMINAL_MEMÓRIA_UTILIZADA

Memória utilizada pelo terminal , Mb

int


para verificar onde está o cerne da questão.

Eu configurei o TERMINAL_MAXBARS para 500 (realmente baixo), mas ele ainda está carregando mais barras (imagine que seja de arquivo?) e a memória ainda está rastejando.

Comecei a registrar os contadores de memória listados acima e em breve teremos algum feedback sobre isso.

Ok recebeu algum feedback e parece um pouco estranho. Abaixo estão dois logs "MetaTrader Log" & "PowerShell Log" são dois logs que estou executando que estão registrando o uso de memória. (O script PowerShell está mais cedo neste tópico, eu o atualizei para corresponder ao que está no Gerenciador de Tarefas). Ambos os logs são a primeira e última vez que eu fiz a última execução.

Pontos de interesse:

  1. O TERMINAL_MEMORY_PHYSICAL e o TERMINAL_MEMORY_TOTAL permanecem os mesmos. Estes valores são idênticos em todas as fileiras do registro.
  2. O TERMINAL_MEMORY_AVAILABLE diminuiu de 13902 para 13806
  3. O TERMINAL_MEMORY_USED aumentou de 432 para 528
  4. O número de Kilo Bytes usados pelo sistema passou de 128 300 K (128.3 Mb) na partida para 215 488 K (215.488 Mb) ao longo da duração dos testes

##### Log MetaTrader
##### Isto foi registrado por meu logger em Metatrader. Ele produz toda a memória

TEMPO TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMÓRIA_TOTAL TERMINAL_MEMÓRIA_DISPONÍVEL TERMINAL_MEMÓRIA_UTILIZADA
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Diário PowerShell
#### Isto foi registrado pelo script do PowerShell

29/04/2016 17:31:32 Kilo Bytes em uso 128 300 K
29/04/2016 18:05:08 Kilo Bytes em uso 215 488 K

 
gr101:

Eu configurei o TERMINAL_MAXBARS para 500 (realmente baixo), mas ele ainda está carregando mais barras (imagine que seja de arquivo?) e a memória ainda está rastejando.

Comecei a registrar os contadores de memória listados acima e em breve teremos algum feedback sobre isso.

Ok, recebemos algum feedback e parece um pouco estranho. Abaixo estão dois logs "MetaTrader Log" & "PowerShell Log" são dois logs que estou executando que estão registrando o uso da memória. (O script PowerShell está mais cedo neste tópico, eu o atualizei para corresponder ao que está no Gerenciador de Tarefas). Ambos os logs são a primeira e última vez que eu fiz a última execução.

Pontos de interesse:

  1. O TERMINAL_MEMORY_PHYSICAL e o TERMINAL_MEMORY_TOTAL permanecem os mesmos. Estes valores são idênticos em todas as fileiras do log.
  2. O TERMINAL_MEMORY_AVAILABLE diminuiu de 13902 para 13806
  3. O TERMINAL_MEMORY_USED aumentou de 432 para 528
  4. O número de Kilo Bytes usados pelo sistema passou de 128 300 K (128.3 Mb) na partida para 215 488 K (215.488 Mb) ao longo da duração dos testes

##### Log MetaTrader
##### Isto foi registrado por meu logger em Metatrader. Ele produz toda a memória

TEMPO TERMINAL_MEMORY_PHYSICAL TERMINAL_MEMÓRIA_TOTAL TERMINAL_MEMÓRIA_DISPONÍVEL TERMINAL_MEMÓRIA_UTILIZADA
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Diário PowerShell
#### Isto foi registrado pelo script do PowerShell

29/04/2016 17:31:32 Kilo Bytes em uso 128 300 K
29/04/2016 18:05:08 Kilo Bytes em uso 215 488 K

Eu (notebook, 8GB ram, Win7-64) tenho uso de ram equivalente para cada um dos meus 4 mt4.

Eu acho que não é nada com que você tenha que se preocupar!

Quantos GB ainda estão livres/disponíveis?

 
Carl Schreiber:

Eu (notebook, 8GB ram, Win7-64) tenho uso de ram equivalente para cada um dos meus 4 mt4.

Eu acho que não é nada com que você tenha que se preocupar!

Quantos GB ainda estão livres/disponíveis?

Eu tenho muitas RAM nos níveis acima nos gráficos. O problema é que quando eu o deixo funcionando, ele empurra lentamente o uso da RAM para cima.

Assim, após cerca de uma ou duas horas, ele começa a se esgotar ao máximo.

Atualmente estou rodando o EA no Servidor 2012, 7GB de RAM, 4 Núcleos (não tenho certeza do que são), 64 bits.

 
gr101:

Eu tenho muitas RAM nos níveis acima nos gráficos. O problema é que quando eu o deixo funcionando ele empurra lentamente o uso da RAM para cima.

Assim, depois de cerca de uma ou duas horas, ele começa a ficar no máximo.

Atualmente estou rodando o EA no Servidor 2012, 7GB de RAM, 4 Cores (não tenho certeza do que são), 64 bits.

Uma vez aprendi que parece ser uma característica do Win-Server, mantendo o máximo possível na memória.

Reiniciei os terminais regularmente, mas eu ficaria curioso se isso causaria ou não um acidente!

 
Carl Schreiber:

Uma vez aprendi que parece ser uma característica do Win-Server, mantendo o máximo possível na memória.

Eu reiniciei os terminais regularmente, mas ficaria curioso se isso causaria ou não um travamento!

Interessante... embora pareça ter algo a ver com o carregamento de símbolos para dentro e para fora do Market Watch.

O terminal não trava, ele apenas começa a funcionar muito devagar, inutilizável.

 
gr101:

Interessante... embora pareça ter algo a ver com o carregamento de símbolos para dentro e para fora do Market Watch.

O terminal não trava, apenas começa a funcionar muito devagar, inutilizável e lento.

Como você verifica isso? Talvez o servidor não esteja configurado como máquina rápida para gráficos, mas apenas cálculos matemáticos rápidos e respostas web rápidas?
 

É uma instalação padrão do Server 2012. No entanto, minha teoria é que não importa como é configurado. Um vazamento de memória ocupará sempre, com o tempo, todo o espaço da máquina.

Portanto, não importa a velocidade ou a quantidade de RAM da caixa, se ela tiver um vazamento, então ela atingirá o limite em algum momento.

 

Apenas para contribuir com meus 2 centavos sobre este tópico.

Há muitas boas idéias aqui sobre vazamento e aumento da memória, mas em relação ao tópico e à raiz, minhas considerações são:

- o código fonte publicado não verifica vários retornos de funções relevantes, por exemplo SymbolSelect() return.

- para/entrementes loops baseados no retorno de funções, como SymbolsTotal() poderia ter algum limite ou proteção contra algum retorno de função de valor errado.

Depois de stress/alterar o código e testar novamente, talvez possamos encontrar e comprovar a causa raiz do problema.

 

Eu acho que Rogério Figurelli está correto se muitas chamadas de função não forem devolvidas a memória alocada não será liberada.

Talvez você possa diminuir o tamanho do empilhamento para ver se ele dá erro de transbordo de pilha.

Empilhar

Em cada programa MQL4, uma área especial de memória chamada stack é alocada para armazenar variáveis de funções locais que são criadas automaticamente. Uma pilha é alocada para todas as funções. O tamanho padrão da pilha é 256 kb, o tamanho da pilha pode ser gerenciado usando a diretiva #property stackize compiler size.

As variáveis locaisestáticas são armazenadas no mesmo local onde outras variáveis estáticas e globais são armazenadas - em uma área de memória especial, que existe separadamente da pilha. As variáveis criadas dinamicamente também usam uma área de memória separada da pilha.

Com cada chamada de função, um lugar na pilha é alocado para variáveis internas não estáticas. Após sair da função, a memória fica disponível para uso novamente.

Se da primeira função for chamada a segunda, então a segunda função ocupa o tamanho necessário da memória da pilha restante para suas variáveis. Assim, ao utilizar as funções incluídas, a memória da pilha será ocupada seqüencialmente para cada função. Isto pode levar a uma escassez de memória durante uma das chamadas de função, tal situação é chamada de estouro de pilha.

Portanto, para grandes dados locais você deve usar melhor a memória dinâmica - ao entrar numa função, alocar a memória, que é necessária para as necessidades locais, no sistema (novo, ArrayResize()), e ao sair da função, liberar a memória (delete, ArrayFree()).

Veja também

Tipos de dados, Encapsulamento e Extensibilidade de Tipos,Inicialização de Variáveis, Escopo de Visibilidade e Tempo de Vida das Variáveis, Criação e Eliminação de Objetos

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
 

Pontos positivos.

Vamos tentar e dar um retorno aqui com resultados.

Obrigado