Voracité de la mémoire RAM de MT5, problèmes de lecture/écriture de gros fichiers - page 6

 
Vladimir:

Je recommande d'effectuer d'abord un changement minimal, afin que la réallocation de la mémoire soit moins fréquente. Deux lignes

m_total_rows++ ;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000) ;

dans bool CSVReader::AddData(string data_str,bool header) remplacer par

m_total_rows++ ;
si (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns) ;

Le nombre de réallocations de mémoire avec copie devrait devenir O(log(n,2)) au lieu de O(n). 20 au lieu de 600 mille. Peut-être que ça te suffit maintenant.

Merci ! Je veux vous faire savoir ce que j'ai :

1. Pas de changement de mémoire - de 10 gigaoctets le code actuel mangeait de la RAM ici et là.

2. En vitesse :

2.1 Ancienne version 574 secondes

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 Nouvelle version : 138 secondes.

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

Vous obtenez donc un gain de 4 fois, ce qui est plutôt bien ! Cependant, la mémoire est limitée, et c'est loin d'être tout ce qui doit être chargé.....

 
Maxim Dmitrievsky:

très pratique :)

J'ai donc converti le CSV en binaire, sans la date.

Il s'avère qu'en s'exécutant, le script a utilisé 1 gigaoctet de mémoire, ce qui, comparé à 10, est très bien. Cependant, c'est toujours beaucoup :)

En termes de vitesse - seulement 16 secondes ! Très bien !

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:

Je recommande d'effectuer d'abord un changement minimal, afin que la réallocation de la mémoire soit moins fréquente. Deux lignes

m_total_rows++ ;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000) ;

dans bool CSVReader::AddData(string data_str,bool header) remplacer par

m_total_rows++ ;
if (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns) ;

Le nombre de réallocations de mémoire avec copie devrait devenir O(log(n,2)) au lieu de O(n). 20 au lieu de 600 mille. Peut-être que cela sera suffisant pour vous.

En fait, le troisième paramètre de ArrayResize() est spécifié pour une raison... C'est un mauvais changement.

Lisez la documentation

 
Roffild:

En fait, le troisième paramètre de ArrayResize() est spécifié pour une raison... un changement de plume...

Lisez la documentation

Qu'avez-vous appris de la documentation sur le troisième paramètre, utile dans ce cas, pour résoudre le problème de la mise en mémoire de .csv créés dans différents programmes et ayant une taille arbitraire ?

N'hésitez pas à suggérer une meilleure modification, non binaire, qui augmente la vitesse de réallocation de la mémoire (en réduisant le nombre d'appels ArrayResize) plus que la recherche binaire...

 
Aleksey Vyazmikin:

Merci ! Je vous ferai savoir ce qui en ressort :

1. Pas de changement de mémoire - de 10 gigaoctets le code actuel mangeait de la RAM ici et là.

2. En vitesse :

2.1 Ancienne version 574 secondes

2.2 Nouvelle version : 138 secondes.

Vous obtenez donc un gain de 4 fois, ce qui est plutôt bien ! Cependant, la mémoire est étroite, et il n'y a pas grand-chose à charger.....

Après la lecture, dans bool CSVReader::Load(int start_line), après la ligne

FileClose(filehandle) ;

insérer la libération de la mémoire

ArrayResize(m_cells,m_total_rows*m_total_columns) ;

Libère inutilement 0-50% de la mémoire occupée par les m_cells. Seulement m_cells lui-même, sans le contenu des cellules.

 

Je suis en train de créer une petite bibliothèque pour travailler rapidement avec les CSV.

Sur la capture d'écran se trouve un essai qui passe en 7 secondes ! !! Processeur Xeon, fréquence 3.0.

Tout d'abord, le script établit le format des données pour chaque colonne. Il y a 6 colonnes. Ensuite, 1000000 lignes sont ajoutées au tableau, puis elles sont remplies avec des nombres de 0 à 999999. Selon le format des données, les chiffres peuvent être perçus différemment. Ensuite, tout est enregistré dans un fichier.

La taille du fichier est de 65,4 Mo. L'ensemble de la structure occupait 232 Mo en mémoire.

 
Aleksey Vyazmikin:

J'ai donc converti le CSV en binaire, sans la date.

Il s'avère qu'en s'exécutant, le script a utilisé 1 gigaoctet de mémoire, ce qui, comparé à 10, est très bien. Cependant, c'est toujours beaucoup :)

En termes de vitesse - seulement 16 secondes ! Très bien !

Eh bien, le script lui-même est toujours paralysé.

 
Vladimir:

Après la lecture, dans bool CSVReader::Load(int start_line), après la ligne

FileClose(filehandle) ;

ins ins ins de mémoire de libération

ArrayResize(m_cells,m_total_rows*m_total_columns) ;

Libère inutilement 0-50% de la mémoire occupée par m_cells. Seulement m_cells lui-même, sans le contenu des cellules.

Merci, mais après avoir fermé le fichier/fini le script, la mémoire est rapidement libérée de toute façon. Voici comment réduire la consommation tout en courant....

 
Aliaksandr Hryshyn:

Je suis en train de créer une petite bibliothèque pour la manipulation rapide des CSV.

Sur la capture d'écran se trouve un essai qui passe en 7 secondes ! !! Processeur Xeon, fréquence 3.0.

Tout d'abord, le script établit le format des données pour chaque colonne. Il y a 6 colonnes. Ensuite, 1000000 lignes sont ajoutées au tableau, puis elles sont remplies avec des nombres de 0 à 999999. Selon le format des données, les chiffres peuvent être perçus différemment. Ensuite, tout est enregistré dans un fichier.

La taille du fichier est de 65,4 Mo. L'ensemble de la structure occupait 232 Mo en mémoire.

Très intéressant. Envisagez-vous de publier vos réalisations en matière de programmation ?

 
Maxim Dmitrievsky:

Eh bien, le script lui-même est toujours un désordre.

Pouvez-vous me dire ce qu'il faut réparer ?

#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])
                    );
     }
  }
Raison: