voracità della memoria RAM di MT5, problemi con la lettura/scrittura di file di grandi dimensioni - pagina 3

 
Vladislav Andruschenko:
oop

Posso vedere che oop... perché scrivere gli array in stringhe quando puoi scriverli in binario in una volta sola

 
Maxim Dmitrievsky:

Vedo che oop... perché scrivere gli array in stringhe quando puoi scriverli in binario in una volta sola?

È scritto, l'uomo li elabora in excel.

 
Sergey Savinkin:

Dice che l'uomo li elabora in Excel.

non dice che

 
Maxim Dmitrievsky:

Non c'è scritto questo.

Il primissimo post. Se leggete attentamente, questo file potrebbe non avere nulla a che fare con MT5. O gestito in un modo specifico.

 
Sergey Savinkin:

Il primissimo post. Se leggete attentamente, questo file potrebbe non essere collegato a MT5. O gestito in un modo specifico.

Quindi lasciate che sia lui a determinare da dove lo prende

Può essere letto anche come un array, credo.
 
Aleksey Vyazmikin:

Grazie per l'analisi del codice.

Faccio fatica a capire l'OOP, quindi fare delle modifiche è una tortura per me. Come ho capito si tratta della classe, che è responsabile della lettura, che lì l'intero file è diviso in array di stringhe, e solo allora, se voglio, converto questi valori di stringa in un altro tipo e li metto in array di tipo int nel mio script. Se ho capito bene, allora per accelerare il processo, dovrei leggere l'intero file e capire quante righe e colonne ci sono e quanti simboli ci sono in ogni cella, e poi selezionare immediatamente la dimensione dell'array? Allora come fare?

Vorrei capire da dove vengono presi 400 megabyte in una volta sola? Ho capito bene che la memoria viene allocata, ma non viene cancellata/regalata quella allocata in precedenza?

400 Mb sono 36 milioni di celle con righe vuote, 12 byte ciascuna, 12*36=432.

Per sapere come farlo meglio, parlaci del problema che stai risolvendo. Quanto spesso e quanto cambia il file, se tutti devono leggere da esso ogni volta, se il numero di celle non vuote è costante da riga a riga, se tutte le celle contengono solo numeri interi. Forse 9 minuti dovrebbero essere spesi una volta alla settimana e non è affatto molto - allora non c'è bisogno di cambiare nulla.

In generale, in termini di "dove andare per essere più veloci", la direzione principale è dichiarare una struttura con 57 campi corrispondenti a valori interi, e usarla sia per la scrittura che per la lettura (il file è binario). Allora 78 Mb saranno letti più velocemente di un secondo dal disco direttamente in memoria, senza delimitatori o rappresentazioni di stringhe. Per scopi di debug, salvate anche l'output in .csv. La dimensione del file determina immediatamente il numero di elementi nell'array di queste strutture.

 
Vladimir:

400 MB sono 36 milioni di celle con righe vuote, ciascuna di 12 byte, 12*36=432.

La matematica è chiara.

Vladimir:

Per sapere come farlo meglio, parlaci del problema che stai risolvendo. Quanto spesso e quanto cambia il file, se tutto deve essere letto da esso ogni volta, se il numero di celle non vuote è costante da riga a riga, se tutte le celle contengono solo numeri interi. Forse 9 minuti dovrebbero essere spesi una volta alla settimana e non è affatto molto - allora non c'è bisogno di cambiare nulla.

Il compito è universale, è leggere i file in formato CSV, perché questo formato è universale per diversi programmi, che attualmente mi forniscono i dati. Se ti riferisci specificamente a questo script, allora sì, devi solo leggere e calcolare tutto, perché Excel si blocca a causa delle formule. Le celle possono contenere numeri non interi (non specificamente in questo esempio). 9 minuti non è molto se è una volta alla settimana... Tuttavia, tra le altre cose, ho bisogno di lavorare con tale quantità di dati attraverso l'ottimizzatore, passando il file al lato e lì conducendo la sua elaborazione con l'aiuto di agenti, quindi ottenere il risultato in formato csv (qui posso, naturalmente, utilizzare un altro formato) e condurre l'elaborazione di nuovo. Ecco perché ho deciso di discutere questo problema pubblicamente, perché voglio elaborare grandi matrici di dati usando MT5.

Vladimir:

In generale, in termini di "dove andare per essere più veloci" - la direzione principale: dichiarare la struttura, 57 campi di cui corrispondono a valori interi, e usarla sia per la scrittura che per la lettura (il file è binario). Allora 78 Mb saranno letti più velocemente di un secondo dal disco direttamente in memoria, senza delimitatori o rappresentazioni di stringhe. Per scopi di debug, salvate anche l'output in .csv. La dimensione del file determina immediatamente il numero di elementi nell'array di queste strutture.

Non riesco nemmeno a immaginare come si possa fare? O è che il file iniziale deve essere generato in condizioni speciali? Allora forse puoi fare un convertitore da CSV al formato binario?

Puoi guardare anche la seconda classe, come insegnargli a scrivere un numero illimitato di colonne?

 
Maxim Dmitrievsky:

WriteArray / Read sono veloci, dimensione massima fino a 300 mb, tutto è molto veloce, non consuma RAM

Perché c'è così tanto codice per la lettura/scrittura, è tutto fatto in 4 righe.

Puoi dimostrare come fare questo?

 
Maxim Dmitrievsky:

quindi lasciamo che sia lui a determinare da dove lo prende

può anche essere letto come un array, credo

CSV è un formato di file universale, che è supportato in vari software, compreso quello associato al MO.

Inoltre, è un file conveniente per trasferire dati tra diversi programmi (script/advisori) MT5, e non richiede molto spazio.

 
Aleksey Vyazmikin:

Puoi dimostrare come fare questo?

prova a leggere il tuo file in questo modo

https://www.mql5.com/ru/docs/files/filereadarray

Non ho tempo di aprire il terminale ora, forse domani)

Документация по MQL5: Файловые операции / FileReadArray
Документация по MQL5: Файловые операции / FileReadArray
  • www.mql5.com
//| Структура для хранения данных о ценах                            | //| Script program start function                                    |
Motivazione: