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

 
Vladimir:

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

2018.07.22 02:08:18.694 Scripts script Pred_Ocenka (Si Splice,M1) loaded successfully
2018.07.22 02:17:52.059 Scripts script Pred_Ocenka (Si Splice,M1) removed

2.2 Nuova versione: 138 secondi.

2018.07.22 02:22:16.728 Scripts script Pred_Ocenka (Si Splice,M1) loaded successfully
2018.07.22 02:24:34.569 Scripts script Pred_Ocenka (Si Splice,M1) removed

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....

 
Maxim Dmitrievsky:

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!

2018.07.22 02:35:12.338 Scripts script Pred_Ocenka_02 (Si Splice,M1) loaded successfully
2018.07.22 02:35:28.334 Scripts script Pred_Ocenka_02 (Si Splice,M1) removed
 
Vladimir:

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

 
Roffild:

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...

 
Aleksey Vyazmikin:

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.

 
Aleksey Vyazmikin:

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.

 
Vladimir:

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....

 
Aliaksandr Hryshyn:

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?

 
Maxim Dmitrievsky:

Beh, la sceneggiatura stessa è ancora un casino.

Mi puoi dire cosa sistemare in esso?

#property version   "1.00"
#property indicator_chart_window
#property strict
//---
#property script_show_inputs
//#include <CSVReader.mqh>                              //Класс по чтению информации из файла
#include <CsvWriter_2.mqh>                            //Класс по записи информации в файл

input string  FileLoadSetup="PredFind\\Test\\Pred_Ocenka_Read.csv";
input int Prediktor=1; //Целевая
input double Support=0.01;//Поддержка
input double Relevantnost=70.0;//Достоверность

//---Переменные
int ArrTest[][57];

CsvWriter Printer;
int Statistic;

int StrokTotal=0;
int arrSize=0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int arrTest2[][57];
   int r=FileOpen("PredFind\\Test\\test.bin",FILE_BIN|FILE_READ);
   if(r!=INVALID_HANDLE) 
     { 
      FileReadArray(r,arrTest2,0,WHOLE_ARRAY);
      Print(arrTest2[1][1]);
      arrSize=ArraySize(arrTest2)/57;
      StrokTotal=arrSize;
      Print(arrSize);

     ArrayFree(ArrTest); 
     ArrayResize(ArrTest,arrSize);

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=1;s<56+1; s++)
           {   
            //Print("s=",s);
            ArrTest[i,s]=arrTest2[i,s];
           }
        }
         Print(ArrTest[2,1]);
      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            if (ArrTest[i,s]>=0)ArrTest[i,s]=ArrTest[i,s]*ArrTest[i,1];
            else ArrTest[i,s]=ArrTest[i,s]*ArrTest[i,2];
           }
        }
   }
     else Print("File open failed, error ",GetLastError()); 
/*    
   int h=FileOpen("PredFind\\Test\\test.bin",FILE_BIN|FILE_WRITE);
   FileWriteArray(h,ArrTest,0,WHOLE_ARRAY);
   FileClose(h);
*/
   
    
   string TimeF=TimeToString(TimeLocal(),TIME_DATE|TIME_MINUTES);
   StringSetCharacter(TimeF,13,'_');
   Statistic=Printer.FileCreate(Symbol()+"_"+TimeF+"_""Pred_Ocenka_Write","PredFind\\Test",false,false,EvryTick); //Создание файла для записи     
   Printer.Write(
                 "arr_Data",
                 "arr_Buy_Sell",
                 "arr_Buy_Sell"
                 );

   for(int i=1;i<arrSize; i++)
     {
      Printer.Write(
                    IntegerToString(0),
                    IntegerToString(ArrTest[i,1]),
                    IntegerToString(ArrTest[i,2]),
                    IntegerToString(ArrTest[i,3]),
                    IntegerToString(ArrTest[i,4]),
                    IntegerToString(ArrTest[i,5]),
                    IntegerToString(ArrTest[i,6]),
                    IntegerToString(ArrTest[i,7]),
                    IntegerToString(ArrTest[i,8]),
                    IntegerToString(ArrTest[i,9]),
                    IntegerToString(ArrTest[i,10]),
                    IntegerToString(ArrTest[i,11]),
                    IntegerToString(ArrTest[i,12]),
                    IntegerToString(ArrTest[i,13]),
                    IntegerToString(ArrTest[i,14]),
                    IntegerToString(ArrTest[i,15]),
                    IntegerToString(ArrTest[i,16]),
                    IntegerToString(ArrTest[i,17]),
                    IntegerToString(ArrTest[i,18]),
                    IntegerToString(ArrTest[i,19]),
                    IntegerToString(ArrTest[i,20]),
                    IntegerToString(ArrTest[i,21]),
                    IntegerToString(ArrTest[i,22]),
                    IntegerToString(ArrTest[i,23]),
                    IntegerToString(ArrTest[i,24]),
                    IntegerToString(ArrTest[i,25]),
                    IntegerToString(ArrTest[i,26]),
                    IntegerToString(ArrTest[i,27]),
                    IntegerToString(ArrTest[i,28]),
                    IntegerToString(ArrTest[i,29]),
                    IntegerToString(ArrTest[i,30]),                                                                                
                    IntegerToString(ArrTest[i,31]),
                    IntegerToString(ArrTest[i,32]),
                    IntegerToString(ArrTest[i,33]),
                    IntegerToString(ArrTest[i,34]),
                    IntegerToString(ArrTest[i,35]),
                    IntegerToString(ArrTest[i,36]),
                    IntegerToString(ArrTest[i,37]),
                    IntegerToString(ArrTest[i,38]),
                    IntegerToString(ArrTest[i,39]),
                    IntegerToString(ArrTest[i,40]),
                    IntegerToString(ArrTest[i,41]),
                    IntegerToString(ArrTest[i,42]),
                    IntegerToString(ArrTest[i,43]),
                    IntegerToString(ArrTest[i,44]),
                    IntegerToString(ArrTest[i,45]),
                    IntegerToString(ArrTest[i,46]),
                    IntegerToString(ArrTest[i,47])
                    );
     }
  }