Metatrader 5 - Richiede molta memoria quando si scorre un grafico attraverso i simboli - pagina 4

 
Carl Schreiber:

Hai provato a impostareTERMINAL_MAXBARScon TerminalInfoInteger(..) su un valore ragionevolmente piccolo?

Oltre a questo avete:

TERMINAL_MEMORY_PHYSICAL

Memoria fisica nel sistema, Mb

int

TERMINALE_MEMORIA_TOTALE

Memoria disponibile per il processo del terminale, Mb

int

TERMINALE_MEMORIA_DISPONIBILE

Memoria libera del processo del terminale, Mb

int

TERMINALE_MEMORIA_USATA

Memoria utilizzata dal terminale, Mb

int


per controllare dov'è il nocciolo della questione.

Ho impostato TERMINAL_MAXBARS a 500 (davvero basso) ma sta ancora caricando altre barre (immaginate che sia da file?) e la memoria continua a salire.

Ho iniziato a registrare i contatori di memoria elencati sopra e avrò presto un feedback su questo.

Ok ho avuto un feedback e sembra un po' strano. Qui sotto ci sono due log "MetaTrader Log" & "PowerShell Log" sono due log che sto eseguendo e che registrano l'utilizzo della memoria. (Lo script PowerShell è in precedenza in questo thread, l'ho aggiornato per abbinare ciò che è in Task Manager). Entrambi questi log sono la prima e l'ultima volta che ho fatto l'ultima esecuzione.

Punti di interesse:

  1. I valori TERMINAL_MEMORY_PHYSICAL e TERMINAL_MEMORY_TOTAL rimangono gli stessi. Questi valori sono identici in ogni riga in tutto il registro.
  2. Il TERMINAL_MEMORY_AVAILABLE è diminuito da 13902 a 13806
  3. Il TERMINAL_MEMORY_USED è aumentato da 432 a 528
  4. Il numero di Kilo Byte utilizzati dal sistema è passato da 128 300 K (128,3 Mb) all'avvio a 215 488 K (215,488 Mb) per tutta la durata del test

##### Log di MetaTrader
##### Questo è stato registrato dal mio logger in Metatrader. Emette tutta la memoria

TEMPO TERMINALE_MEMORIA_FISICA TOTALE_MEMORIA_TERMINALE TERMINALE_MEMORIA_DISPONIBILE TERMINALE_MEMORIA_USATA
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Log PowerShell
#### Questo è stato registrato dallo script PowerShell

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

 
gr101:

Ho impostato il TERMINAL_MAXBARS a 500 (molto basso) ma sta ancora caricando più barre (immaginate che sia da file?) e la memoria continua a salire.

Ho iniziato a registrare i contatori di memoria elencati sopra e presto avrò un feedback su questo.

Ok ho avuto qualche riscontro e sembra un po' strano. Qui sotto ci sono due log "MetaTrader Log" & "PowerShell Log" sono due log che sto eseguendo e che registrano l'utilizzo della memoria. (Lo script PowerShell è in precedenza in questo thread, l'ho aggiornato per abbinare ciò che è in Task Manager). Entrambi questi log sono la prima e l'ultima volta che ho fatto l'ultima esecuzione.

Punti di interesse:

  1. I valori TERMINAL_MEMORY_PHYSICAL e TERMINAL_MEMORY_TOTAL rimangono gli stessi. Questi valori sono identici in ogni riga in tutto il log.
  2. Il TERMINAL_MEMORY_AVAILABLE è diminuito da 13902 a 13806
  3. Il TERMINAL_MEMORY_USED è aumentato da 432 a 528
  4. Il numero di Kilo Byte utilizzati dal sistema è passato da 128 300 K (128,3 Mb) all'avvio a 215 488 K (215,488 Mb) per tutta la durata del test

##### Log di MetaTrader
##### Questo è stato registrato dal mio logger in Metatrader. Emette tutta la memoria

TEMPO TERMINALE_MEMORIA_FISICA TOTALE_MEMORIA_TERMINALE TERMINALE_MEMORIA_DISPONIBILE TERMINALE_MEMORIA_USATA
2016.04.29 17:31:58 7167 14334 13902 432
2016.04.29 18:04:38 7167 14334 13806 528


#### Log PowerShell
#### Questo è stato registrato dallo script PowerShell

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

Io (notebook, 8GB ram, Win7-64) ho un utilizzo di ram equivalente per ognuno dei miei 4 mt4.

Penso che non sia nulla di cui tu debba preoccuparti!

Quanti GB sono ancora liberi/disponibili?

 
Carl Schreiber:

Io (notebook, 8GB ram, Win7-64) ho un utilizzo di ram equivalente per ognuno dei miei 4 mt4.

Penso che non ci sia nulla di cui preoccuparsi!

Quanti GB sono ancora liberi/disponibili?

Ho un sacco di RAM ai livelli di cui sopra nei grafici. Il problema è che quando lo lascio in esecuzione spinge lentamente l'utilizzo della RAM verso l'alto.

Quindi dopo circa un'ora o due inizia a massimizzare.

Attualmente sto eseguendo l'EA su Server 2012, 7 GB di RAM, 4 core (non so quali siano), 64 bit.

 
gr101:

Ho un sacco di RAM ai livelli di cui sopra nei grafici. Il problema è che quando lo lascio in esecuzione spinge lentamente l'utilizzo della RAM verso l'alto.

Quindi dopo circa un'ora o due inizia a massimizzare.

Attualmente sto eseguendo l'EA su Server 2012, 7 GB di RAM, 4 core (non so quali siano), 64 bit.

Una volta ho imparato che sembra essere una caratteristica di Win-Server che mantiene il più possibile in memoria.

Ho riavviato regolarmente i terminali, ma sarei curioso di sapere se questo può causare un crash o meno!

 
Carl Schreiber:

Una volta ho imparato che sembra essere una caratteristica di Win-Server che tiene il più possibile in memoria.

Ho riavviato regolarmente i terminali, ma sarei curioso di sapere se questo provoca un crash o no!

Interessante... anche se sembra avere a che fare con il caricamento dei simboli dentro e fuori il Market Watch.

Il terminale non si blocca, ma inizia a funzionare molto lentamente, in modo inutilizzabile.

 
gr101:

Interessante... anche se sembra avere a che fare con il caricamento dei simboli dentro e fuori il Market Watch.

Il terminale non si blocca, ma inizia a funzionare molto lentamente, in modo inutilizzabile.

Come si fa a controllare questo? Forse il server non è impostato come macchina veloce per la grafica ma solo per i calcoli matematici veloci e le risposte veloci del web?
 

È un'installazione standard di Server 2012. Tuttavia la mia teoria è che non importa come è impostato. Una perdita di memoria, nel tempo, occuperà sempre tutto lo spazio sulla macchina.

Quindi non importa quanto veloce o quanta RAM abbia la scatola, se ha una perdita, a un certo punto raggiungerà il limite.

 

Solo per contribuire con i miei 2 centesimi su questo argomento.

Ci sono un sacco di buone idee qui sulla perdita di memoria e sull'aumento, ma per quanto riguarda l'argomento e la causa principale le mie considerazioni sono:

- il codice sorgente pubblicato non controlla diversi ritorni di funzioni rilevanti, per esempio il ritorno di SymbolSelect().

- I cicli for/while basati sul ritorno di funzioni, come SymbolsTotal() potrebbero avere qualche limite o protezione contro qualche ritorno di funzione di valore sbagliato.

Dopo aver stressato/modificato il codice e testato di nuovo, forse possiamo trovare e risolvere la causa principale del problema.

 

Penso che Rogerio Figurelli sia corretto, se molte chiamate a funzioni non vengono restituite la memoria allocata non verrà liberata.

Forse potete diminuire lo stacksize per vedere se dà errore di stack overflow.

Stack

In ogni programma MQL4, una speciale area di memoria chiamata stack viene allocata per memorizzare le variabili locali delle funzioni che vengono create automaticamente. Uno stack è allocato per tutte le funzioni. La dimensione predefinita dello stack è di 256 kb, la dimensione dello stack può essere gestita utilizzando la direttiva del compilatore #property stacksize.

Le variabili localistatiche sono memorizzate nello stesso posto in cui sono memorizzate le altre variabili statiche e globali - in un'area di memoria speciale, che esiste separatamente dallo stack. Anche le variabili create dinamicamente usano un'area di memoria separata dallo stack.

Con ogni chiamata di funzione, viene allocato un posto sullo stack per le variabili interne non statiche. Dopo l'uscita dalla funzione, la memoria è di nuovo disponibile per l'uso.

Se dalla prima funzione viene chiamata la seconda, allora la seconda funzione occupa la dimensione richiesta dalla rimanente memoria dello stack per le sue variabili. Così, quando si usano funzioni incluse, la memoria dello stack sarà occupata sequenzialmente per ogni funzione. Questo può portare ad una carenza di memoria durante una delle chiamate di funzione, una tale situazione è chiamata stack overflow.

Perciò, per dati locali di grandi dimensioni dovreste usare meglio la memoria dinamica - quando entrate in una funzione, allocate la memoria, che è richiesta per le necessità locali, nel sistema (new, ArrayResize()), e quando uscite dalla funzione, rilasciate la memoria (delete, ArrayFree()).

Vedere anche

Tipi di dati, Incapsulamento ed estensibilità dei tipi,Inizializzazione delle variabili, Ambito di visibilità e durata delle variabili, Creazione ed eliminazione di oggetti

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
 

Buoni punti.

Farò una prova qualche volta e darò un feedback qui con i risultati.

Grazie