voracità della memoria RAM di MT5, problemi con la lettura/scrittura di file di grandi dimensioni - pagina 2
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ho già incontrato questo problema. Ho fatto molte correzioni. Non ricordo tutto - è stato un compito unico,
ma prova a impostareArrayResize(arrRead_01,arrSize); il 3° parametro qui
intreserve_size=0// valore della dimensione della riserva (in eccesso )
e sperimentare.
Grazie, ma tutti i ritardi e il consumo di memoria, a giudicare dai miei esperimenti, si verificano nella classe di lettura delle informazioni dal file. Forse qualcosa può essere regolato lì?
A giudicare dalla velocità di riallocazione della memoria, gli array di stringhe sono memorizzati come array di oggetti, non puntatori ad essi, da qui i freni. Abbiamo bisogno che gli sviluppatori chiariscano questo problema, la soluzione dipende da questo.
Poi, il parser crea un array locale di celle dalla stringa e poi le copia nella memoria allocata, che è una stampella inutile, e significativa.
Se come un array di oggetti - allora, a seconda della frequenza e del numero di aggiornamenti delle celle nel problema, probabilmente sarebbe più conveniente in termini di tempo non analizzare il file al caricamento, e memorizzare xw-file come un array di righe di file e aggiornare i dati al volo (cioè, analizzare la stringa ad ogni accesso alla cella). In ogni caso, il parser deve essere riscritto, è estremamente inefficiente e non supporta le celle quotate ed è adatto solo per importare tabelle numeriche.
A giudicare dalla velocità di riallocazione della memoria, gli array di stringhe sono memorizzati come array di oggetti, non puntatori ad essi, da qui i freni. Abbiamo bisogno di sviluppatori per chiarire questa domanda, la soluzione dipende da questo.
Proviamo a chiamare lo sviluppatore,@Renat Fatkhullin- puoi chiarire la situazione?
Quindi, il parser crea un array locale di celle da una stringa e poi le copia nella memoria allocata - una stampella inutile, e significativa.
Come possiamo liberarcene?
Se come array di oggetti, a seconda della frequenza e del numero di aggiornamenti delle celle nel problema, probabilmente, sarebbe più economico in termini di tempo non analizzare il file al caricamento, e memorizzare xw-file come array di righe di file e aggiornare i dati al volo (cioè analizzare la stringa ad ogni accesso alla cella). In ogni caso, il parser deve essere riscritto, è estremamente inefficiente e non supporta le celle quotate ed è buono solo per importare tabelle numeriche.
"Array of file lines" - cosa intendete con questo? Se si tratta solo di creare un array per contenere tutte le stringhe, allora, per quanto ho capito, la lunghezza della stringa ha un limite di caratteri, no?
Il corso di lettura è stato scritto da un dipendente della MQ, ho pensato che fosse tutto scritto in modo intelligente.
Il parser legge il testo correttamente, non sono d'accordo con te qui - lo script precedentemente allegato lo conferma.
Proviamo a chiamare lo sviluppatore,@Renat Fatkhullin- puoi chiarire la situazione?
Come ci si può liberare?
"Array of file strings" - che cosa intendi? Se si tratta solo di creare un array che conterrà tutte le stringhe, allora, per quanto ho capito, la lunghezza della stringa ha dei limiti sul numero di caratteri, no?
Il corso di lettura è stato scritto da un dipendente della MQ, ho pensato che fosse tutto scritto in modo intelligente.
Il parser legge correttamente il testo, non sono d'accordo con te - lo script precedentemente allegato lo conferma.
Legge correttamente i file dove non ci sono stringhe quotate, all'interno delle quali c'è un carattere delimitatore. Provate a leggere 60;""campione; stringa"" da esso. L'output dovrebbe contenere 2 celle: [60] e [sample;string]. Probabilmente otterrete 3 - [60] ["sample;string"]. (HH inoltre, qusv permette stringhe sillabate :) )
So come mi sbarazzerei di questo in C o plus: allocare prima un array di puntatori a stringa e riempirlo analizzando la stringa. Non ci sono puntatori in mcl, non capisco come affrontare questo compito. Speriamo che Renat possa chiarire.
"Un array di stringhe di file" - cosa intendete con questo? Se si tratta solo di creare un array che conterrà tutte le stringhe, allora, per quanto ho capito, la lunghezza della stringa ha un limite di caratteri, no?
Voglio dire, leggere il file riga per riga e memorizzare ogni riga originale del file in un array senza analizzarlo. Quando si accede alla stringa per formato (riga, colonna), si prende la riga della stringa, la si analizza al volo e si restituisce il valore della colonna, memorizzando nella cache il risultato dell'analisi allo stesso tempo.
Ecco un'altra possibile soluzione. Quando leggete un file, fate un parsing - salvate per ogni riga un array di due valori interi: l'indice del carattere che inizia il valore della cella nella riga, e la lunghezza di quella sottostringa.
Per esempio:
строка в файле : 54;345;12;12345
индекс символа : 0 3 7 10
длина подстроки: 2 3 2 5
Legge correttamente i file dove non ci sono stringhe quotate con un carattere delimitatore all'interno. Provate a leggere 60;""campione; stringa"" con esso. L'output dovrebbe essere di 2 celle: [60] e [sample;string]. Probabilmente otterrete 3 - [60] ["sample;string"]. (HH inoltre, qusv permette stringhe sillabate :) )
Oh, capisco, non sapevo di queste sottigliezze dello standard CSV. Grazie per avermi illuminato sulle peculiarità!
So come me ne sbarazzerei in C o plus - alloco prima un array di puntatori a stringa e lo riempio, analizzando la stringa. Non ci sono puntatori in mcl, non capisco come affrontare questo compito. Speriamo che Renat possa chiarire.
Speriamo che Renat possa chiarire.
Voglio dire, leggere il file riga per riga e memorizzare ogni riga originale del file in un array senza analizzarlo. Quando si accede alla stringa per formato (riga, colonna), prendere la stringa riga, analizzarla al volo e restituire il valore della colonna, memorizzando nella cache il risultato dell'analisi.
Sì, penso che sarebbe ottimale nel tempo, anche la cache non è veramente necessaria, credo. Puoi aiutare e fare modifiche appropriate alla classe per implementare questo approccio?
Ecco un'altra possibile soluzione. Quando leggete un file, fate un parsing - salvate per ogni riga un array di due valori interi: l'indice del carattere che inizia il valore della cella nella riga, e la lunghezza di quella sottostringa.
Per esempio:
строка в файле : 54;345;12;12345
индекс символа : 0 3 7 10
длина подстроки: 2 3 2 5
Beh, sì, questo è più o meno l'approccio di cui ho scritto sopra oggi - calcolare prima cosa è cosa, e poi riempire l'array. Ma non ho idea di come implementarlo :(
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
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