Obur bellek RAM MT5, büyük dosyaları okuma / yazma ile ilgili sorunlar - sayfa 6

 
Vladimir :

İlk önce minimum bir değişiklik yapmanızı öneririm, böylece bellek yeniden tahsisi daha az sıklıkla yapılır. İki çizgi

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

bool içinde CSVReader::AddData( string data_str, bool header) ile değiştirin

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

Kopya ile bellek yeniden tahsislerinin sayısı O(n) yerine O(log(n,2)) olmalıdır. 600 bin yerine 20. Belki bu zaten sizin için yeterlidir.

Teşekkür ederim! Ne olduğunu bana bildirin:

1. Bellekte herhangi bir değişiklik yok - mevcut kod burada ve orada 10 gigabayt RAM tüketti.

2. Hızla:

2.1 Eski sürüm 574 saniye

 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 Yeni sürüm 138 saniye

 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

4 kat bir artış ortaya çıkıyor, ki bu çok iyi! Ancak, bellek arka arkaya ve bu, yüklenmesi gereken her şeyden çok uzak ....

 
Maxim Dmitrievsky :

çok rahat :)

CSV'yi ikili dosyaya dönüştürdüm, eksi tarih.

Olan şu ki, işlem sırasında bellek betiği 10'a kıyasla çok iyi olan 1 gigabayt yedi. Ancak yine de çok fazla :)

Hız açısından - sadece 16 saniye! Çok aptal değil!

 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 :

İlk önce minimum bir değişiklik yapmanızı öneririm, böylece bellek yeniden tahsisi daha az sıklıkla yapılır. İki çizgi

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

bool içinde CSVReader::AddData( string data_str, bool header) ile değiştirin

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

Kopya ile bellek yeniden tahsislerinin sayısı O(n) yerine O(log(n,2)) olmalıdır. 600 bin yerine 20. Belki bu zaten sizin için yeterlidir.

Aslında, ArrayResize() için üçüncü parametreyi bu şekilde belirtmek kolay değil... boktan değişiklik...

Belgeleri okuyun

 
Roffild :

Aslında, ArrayResize() için üçüncü parametreyi bu şekilde belirtmek kolay değil... boktan değişiklik...

Belgeleri okuyun

Farklı programlarda yaratılan ve rastgele bir boyuta sahip olan .csv belleğe kaldırma sorunu olduğunda, bu durumda yararlı olan üçüncü parametre hakkında belgelerden ne elde etmeyi başardınız?

Belleği yeniden tahsis etme performansını artıran ( ArrayResize çağrılarını azaltır) ikili aramadan daha fazla geliştiren daha iyi, saçma sapan olmayan bir değişiklik önermekten çekinmeyin...

 
Aleksey Vyazmikin :

Teşekkür ederim! Ne olduğunu bana bildirin:

1. Bellekte herhangi bir değişiklik yok - mevcut kod burada ve orada 10 gigabayt RAM tüketti.

2. Hızla:

2.1 Eski sürüm 574 saniye

2.2 Yeni sürüm 138 saniye

4 kat bir artış ortaya çıkıyor, ki bu çok iyi! Ancak, bellek arka arkaya ve bu, yüklenmesi gereken her şeyden çok uzak ....

Okuduktan sonra, bool CSVReader::Load( int start_line), satırdan sonra

FileClose (dosya tanıtıcı);

boş bellek ekle

Dizi Yeniden Boyutlandırma (m_cells,m_total_rows*m_total_columns);

m_cell'ler tarafından işgal edilen belleğin %0-50'sini gereksiz yere boşaltır. Hücrelerin içeriği olmadan yalnızca m_cells'in kendisi.

 

Şimdi CSV ile hızlı çalışmak için küçük bir kütüphane yapıyorum.

Ekranda 7 saniye süren bir çalışma testi var !!! Xeon işlemci, 3.0 frekans.

İlk olarak, komut dosyası her sütun için bir veri biçimi oluşturur. Sütunlar 6. Ardından tabloya 1000000 satır eklenir, ardından 0'dan 999999'a kadar sayılarla doldurulur. Veri formatına göre sayılar farklı şekillerde algılanabilir. Sonra her şey bir dosyaya kaydedilir.

Dosya boyutu 65.4 Mb. Bellekteki tüm yapı 232 MB işgal etti.

 
Aleksey Vyazmikin :

CSV'yi ikili dosyaya dönüştürdüm, eksi tarih.

Olan şu ki, işlem sırasında bellek komut dosyası 10'a kıyasla çok iyi olan 1 gigabayt yedi. Ancak yine de çok fazla :)

Hız açısından - sadece 16 saniye! Çok aptal değil!

iyi, senaryonun kendisi hala sakar

 
Vladimir :

Okuduktan sonra, bool CSVReader::Load( int start_line), satırdan sonra

FileClose (dosya tanıtıcı);

boş bellek ekle

Dizi Yeniden Boyutlandırma (m_cells,m_total_rows*m_total_columns);

m_cell'ler tarafından işgal edilen belleğin %0-50'sini gereksiz yere boşaltır. Hücrelerin içeriği olmadan yalnızca m_cells'in kendisi.

Ancak teşekkür ederiz, dosyayı kapattıktan / komut dosyasını bitirdikten sonra, bellek yine de hızlı bir şekilde boşaltılır. Çalışma sırasında tüketimi nasıl azaltacağınız aşağıda açıklanmıştır....

 
Aliaksandr Hryshyn :

Şimdi CSV ile hızlı çalışmak için küçük bir kütüphane yapıyorum.

Ekranda 7 saniye süren bir çalışma testi var !!! Xeon işlemci, 3.0 frekans.

İlk olarak, komut dosyası her sütun için bir veri biçimi oluşturur. Sütunlar 6. Ardından tabloya 1000000 satır eklenir, ardından 0'dan 999999'a kadar sayılarla doldurulur. Veri formatına göre sayılar farklı şekillerde algılanabilir. Sonra her şey bir dosyaya kaydedilir.

Dosya boyutu 65.4 Mb. Bellekteki tüm yapı 232 MB işgal etti.

Çok ilginç. Programlamadaki başarılarınızı herkese açık olarak yayınlamayı planlıyor musunuz?

 
Maxim Dmitrievsky :

iyi, senaryonun kendisi hala sakar

İçinde ne düzelteceğimi söyler misin?

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