voracidade da memória MT5 RAM, problemas com a leitura/escrita de arquivos grandes - página 6

 
Vladimir:

Recomendo fazer uma mudança mínima primeiro, para que a realocação de memória seja feita com menos freqüência. Duas linhas

m_total_rows++;
ArrayResize(m_células,m_total_linhas*m_total_colunas,10000);

em bool CSVReader::AdicionarData(string data_str,bool header) substituir por

m_total_rows++;
se (m_total_linhas*m_total_colunas>ArraySize(m_cells)) ArrayResize(m_células,2*m_total_linhas*m_total_colunas);

O número de realocações de memória com cópia deve se tornar O(log(n,2)) em vez de O(n). 20 ao invés de 600 mil. Talvez isso seja suficiente para você agora.

Obrigado! Quero que você saiba o que eu tenho:

1. Nenhuma mudança na memória - por 10 gigabytes o código atual comia RAM ali e ali.

2. Por velocidade:

2.1 Versão antiga 574 segundos

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 Nova versão: 138 segundos.

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

Assim você obtém um ganho de 4 vezes, o que é muito bom! Entretanto, a memória é apertada, e isto está longe de ser tudo o que precisa ser carregado....

 
Maxim Dmitrievsky:

muito útil :)

Assim, converti o CSV em binário, menos a data.

O que acontece é que, ao executar o roteiro, foi preciso 1 gigabyte de memória, o que, comparado a 10, é muito bom. No entanto, ainda muito :)

Em termos de velocidade - apenas 16 segundos! Muito bom!

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:

Recomendo fazer uma mudança mínima primeiro, para que a realocação de memória seja feita com menos freqüência. Duas linhas

m_total_linhas++;
ArrayResize(m_células,m_total_linhas*m_total_colunas,10000);

em bool CSVReader::AdicionarData(string data_str,bool header) substituir por

m_total_linhas++;
if (m_total_linhas*m_total_colunas>ArraySize(m_cells)) ArrayResize(m_células,2*m_total_linhas*m_total_colunas);

O número de realocações de memória com cópia deve se tornar O(log(n,2)) em vez de O(n). 20 ao invés de 600 mil. Talvez isso seja suficiente para você.

Na verdade, o terceiro parâmetro para ArrayResize() é especificado por uma razão... É uma má mudança.

Leia a documentação

 
Roffild:

Na verdade, o terceiro parâmetro para ArrayResize() é especificado por uma razão... uma mudança de penas...

Leia a documentação

O que você conseguiu obter da documentação sobre o terceiro parâmetro, útil para este caso, quando resolveu a tarefa de levantar para a memória .csv criada em diferentes programas e com tamanho arbitrário?

Sinta-se livre para sugerir uma mudança melhor, não binária, o que aumenta a velocidade da realocação de memória (reduzindo o número de chamadas ArrayResize) mais do que a busca binária...

 
Aleksey Vyazmikin:

Obrigado! Eu o informarei do que vier à tona:

1. Nenhuma mudança na memória - por 10 gigabytes o código atual comia RAM ali e ali.

2. Por velocidade:

2.1 Versão antiga 574 segundos

2.2 Nova versão: 138 segundos.

Assim você obtém um ganho de 4 vezes, o que é muito bom! No entanto, a memória é apertada, e não é muito para carregar....

Após a leitura, em bool CSVReader::Load(int start_line), após a linha

FileClose(filehandle);

inserção livre de memória

ArrayResize(m_células,m_total_linhas*m_total_colunas);

Liberta 0-50% da memória ocupada por m_cells desnecessárias. Somente m_células em si, sem conteúdo celular.

 

Agora estou fazendo uma pequena biblioteca para o manuseio rápido de CSV.

Na imagem da tela há um teste que é realizado em 7 segundos!!! Processador Xeon, freqüência 3.0.

Primeiro o script compõe o formato de dados para cada coluna. Há 6 colunas. Em seguida, 1000000 linhas são adicionadas à tabela, depois são preenchidas com números de 0 a 999999. De acordo com o formato dos dados, os números podem ser percebidos de forma diferente. Depois, tudo é salvo em um arquivo.

O tamanho do arquivo é 65,4 MB. Toda a estrutura ocupou 232 MB na memória.

 
Aleksey Vyazmikin:

Assim, converti o CSV em binário, menos a data.

O que acontece é que, ao executar o roteiro, foi preciso 1 gigabyte de memória, o que, comparado a 10, é muito bom. No entanto, ainda muito :)

Em termos de velocidade - apenas 16 segundos! Muito bom!

Bem, o roteiro em si ainda está aleijado.

 
Vladimir:

Após a leitura, em bool CSVReader::Load(int start_line), depois da linha

FileClose(filehandle);

inserir liberação de memória

ArrayResize(m_células,m_total_linhas*m_total_colunas);

Liberta 0-50% da memória ocupada por m_cells desnecessárias. Somente m_células em si, sem conteúdo celular.

Obrigada, mas depois de fechar o arquivo/acabamento do roteiro, a memória é rapidamente liberada de qualquer forma. Veja aqui como reduzir o consumo enquanto se executa....

 
Aliaksandr Hryshyn:

Agora estou fazendo uma pequena biblioteca para trabalhar rapidamente com o CSV.

Na imagem da tela há um teste que é realizado em 7 segundos!!! Processador Xeon, freqüência 3.0.

Primeiro o script compõe o formato de dados para cada coluna. Há 6 colunas. Em seguida, 1000000 linhas são adicionadas à tabela, depois são preenchidas com números de 0 a 999999. De acordo com o formato dos dados, os números podem ser percebidos de forma diferente. Depois, tudo é salvo em um arquivo.

O tamanho do arquivo é 65,4 MB. Toda a estrutura ocupou 232 MB na memória.

Muito interessante. Você está planejando publicar publicamente suas realizações de programação?

 
Maxim Dmitrievsky:

Bem, o roteiro em si ainda é uma bagunça.

Você pode me dizer o que devo consertar nele?

#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])
                    );
     }
  }
Razão: