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

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
Raccomando di fare prima un cambiamento minimo, in modo che la riallocazione della memoria sia fatta meno frequentemente. Due linee
m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000);
in bool CSVReader::AddData(string data_str,bool header) sostituire con
m_total_rows++;
se (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns);
Il numero di riallocazioni di memoria con la copia dovrebbe diventare O(log(n,2)) invece di O(n). 20 invece di 600 mila. Forse questo è abbastanza per te ora.
Grazie! Voglio farvi sapere cosa ho trovato:
1. Nessun cambiamento nella memoria - di 10 gigabyte il codice attuale ha mangiato RAM lì e lì.
2. Per velocità:
2.1 Vecchia versione 574 secondi
2.2 Nuova versione: 138 secondi.
Così si ottiene un guadagno di 4 volte, che è abbastanza buono! Tuttavia, la memoria è stretta, e questo è tutt'altro che tutto ciò che deve essere scaricato....
molto utile :)
Così ho convertito CSV in binario, meno la data.
Quello che si scopre, quando si esegue lo script ha occupato 1 gigabyte di memoria, che rispetto a 10 è molto buono. Comunque, ancora molto :)
In termini di velocità - solo 16 secondi! Abbastanza buono!
Raccomando di fare prima un cambiamento minimo, in modo che la riallocazione della memoria sia fatta meno frequentemente. Due linee
m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000);
in bool CSVReader::AddData(string data_str,bool header) sostituire con
m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns);
Il numero di riallocazioni di memoria con la copia dovrebbe diventare O(log(n,2)) invece di O(n). 20 invece di 600 mila. Forse questo sarà sufficiente per voi.
In realtà il terzo parametro per ArrayResize() è specificato per una ragione... È un brutto cambiamento.
Leggere la documentazione
In realtà il terzo parametro per ArrayResize() è specificato per una ragione... un cambiamento di piume...
Leggere la documentazione
Cosa hai imparato dalla documentazione sul terzo parametro, utile in questo caso, quando si risolve il problema di sollevare in memoria .csv creati in diversi programmi e di dimensioni arbitrarie?
Sentitevi liberi di suggerire una modifica migliore, non binaria, che aumenta la velocità di riallocazione della memoria (riducendo il numero di chiamate ArrayResize) più della ricerca binaria...
Grazie! Vi farò sapere cosa viene fuori:
1. Nessun cambiamento nella memoria - di 10 gigabyte il codice attuale ha mangiato RAM lì e lì.
2. Per velocità:
2.1 Vecchia versione 574 secondi
2.2 Nuova versione: 138 secondi.
Così si ottiene un guadagno di 4 volte, che è abbastanza buono! Tuttavia, la memoria è stretta, e non c'è molto da caricare....
Dopo la lettura, in bool CSVReader::Load(int start_line), dopo la linea
FileClose(filehandle);
inserire la liberazione della memoria
ArrayResize(m_cells,m_total_rows*m_total_columns);
Libera inutilmente lo 0-50% della memoria occupata da m_cellule. Solo m_cellule stesse, senza il contenuto delle celle.
Ora sto facendo una piccola libreria per lavorare rapidamente con CSV.
Nello screenshot c'è una prova che passa in 7 secondi!!! Processore Xeon, frequenza 3.0.
Prima lo script crea il formato dei dati per ogni colonna. Ci sono 6 colonne. Poi vengono aggiunte 1000000 righe alla tabella, poi vengono riempite con numeri da 0 a 999999. Secondo il formato dei dati i numeri possono essere percepiti in modo diverso. Poi tutto viene salvato in un file.
La dimensione del file è di 65,4 MB. L'intera struttura occupava 232 MB di memoria.
Così ho convertito CSV in binario, meno la data.
Quello che si scopre, quando si esegue lo script ha occupato 1 gigabyte di memoria, che rispetto a 10 è molto buono. Comunque, ancora molto :)
In termini di velocità - solo 16 secondi! Abbastanza buono!
Beh, lo stesso script è ancora storpiato.
Dopo la lettura, in bool CSVReader::Load(int start_line), dopo la linea
FileClose(filehandle);
inserire il rilascio della memoria
ArrayResize(m_cells,m_total_rows*m_total_columns);
Libera inutilmente lo 0-50% della memoria occupata da m_cellule. Solo m_cellule stesse, senza il contenuto delle celle.
Grazie, ma dopo aver chiuso il file/finito lo script, la memoria viene comunque liberata rapidamente. Ecco come ridurre il consumo mentre si corre....
Ora sto facendo una piccola libreria per la gestione veloce di CSV.
Nello screenshot c'è una prova che passa in 7 secondi!!! Processore Xeon, frequenza 3.0.
Prima lo script crea il formato dei dati per ogni colonna. Ci sono 6 colonne. Poi vengono aggiunte 1000000 righe alla tabella, che vengono riempite con numeri da 0 a 999999. Secondo il formato dei dati i numeri possono essere percepiti in modo diverso. Poi tutto viene salvato in un file.
La dimensione del file è di 65,4 MB. L'intera struttura occupava 232 MB di memoria.
Molto interessante. Hai intenzione di pubblicare i tuoi risultati di programmazione pubblicamente?
Beh, la sceneggiatura stessa è ancora un casino.
Mi puoi dire cosa sistemare in esso?