MT5 RAMメモリの容量不足、大容量ファイルの読み書きに問題がある。 - ページ 6

 
Vladimir:

メモリの再割り当ての頻度を少なくするために、まずは最小限の変更をすることをお勧めします。2行

m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000)を実行。

bool CSVReader::AddData(string data_str,bool header) で置き換えてください。

m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells))ArrayResize(m_cells,2*m_total_rows*m_total_columns)とする。

コピーによるメモリ再割り当ての回数は、O(n)ではなく、O(log(n,2))になるはずです。60万円ではなく、20万円。今はそれで十分かもしれませんね。

ありがとうございました。自分の持っているものを知らせたい。

1.メモリに変化はありません。10ギガバイトもあれば、現在のコードはあちこちのRAMを食いつぶしていました。

2.スピードで

2.1 旧バージョン 574秒

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 新バージョン:138秒。

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回分の利得が得られるわけで、これはかなり良いことだと思いますしかし、メモリは厳しいし、これだけでは到底読み込めない......。

 
Maxim Dmitrievsky:

とても便利)

そこで、CSVをバイナリに変換し、日付を除いた。

その結果、スクリプトを実行すると1ギガバイトのメモリを消費し、10と比較すると非常に良好であることがわかりました。とはいえ、やはり多いですね :)

スピード面では、わずか16秒!かなり良いですね!

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:

メモリの再割り当ての頻度を少なくするために、まずは最小限の変更をすることをお勧めします。2行

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

bool CSVReader::AddData(string data_str,bool header) で置き換えてください。

m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells))ArrayResize(m_cells,2*m_total_rows*m_total_columns)を使用します。

コピーによるメモリ再割り当ての回数は、O(n)ではなく、O(log(n,2))になるはずです。60万円ではなく、20万円。もしかしたら、それで十分かもしれません。

実は、ArrayResize() の3番目のパラメータは、ある理由で指定されているのですが...。悪い変化です。

ドキュメントを読む

 
Roffild:

実は、ArrayResize()の3番目のパラメータは、ある理由で指定されているのですが...。羽のような変化...

ドキュメントを読む

異なるプログラムで作成され、任意のサイズを持つ.csvをメモリにリフティングする問題を解決するために、このケースに有用な第3のパラメータについて、ドキュメントから何を学びましたか?

バイナリサーチよりもメモリ再配置の速度を上げる(ArrayResizeの呼び出し 回数を減らす)、より良い、バイナリでない変更を自由に提案してください...。

 
Aleksey Vyazmikin:

ありがとうございました。何が出てくるか、またお知らせします。

1.メモリに変化はありません。10ギガバイトもあれば、現在のコードはあちこちのRAMを食いつぶしていました。

2.スピードで

2.1 旧バージョン 574秒

2.2 新バージョン:138秒。

だから、4回分の利得が得られるわけで、これはかなり良いことだと思いますとはいえ、メモリは厳しいし、読み込むのも一苦労ですが......。

読み込んだ後、bool CSVReader::Load(int start_line)の中で、行の後に

FileClose(filehandle)。

メモリ解放の 挿入

ArrayResize(m_cells,m_total_rows*m_total_columns)を使用します。

m_cellsが占有するメモリの0-50%を不要に開放する。m_cells本体のみで、セルの内容は含まれません。

 

現在、CSVを高速に処理するための小さなライブラリーを作っています。

スクリーンショットには、7秒で通過するテストランがあります!!!!Xeonプロセッサー、周波数3.

まず、スクリプトは各カラムのデータフォーマットを作成する。6つのカラムがあります。そして、1000000行がテーブルに追加され、0から999999までの数字で埋め尽くされます。データ形式によって、数値の捉え方が異なります。そして、すべてがファイルに保存されます。

ファイルサイズは65.4MBです。全体の構成は、メモリに232MBを消費した。

 
Aleksey Vyazmikin:

そこで、CSVをバイナリに変換し、日付を除いた。

その結果、スクリプトを実行すると1ギガバイトのメモリを消費し、10と比較すると非常に良好であることがわかりました。ただし、それでも多い :)

スピード面では、わずか16秒!かなり良いですね!

まあ、スクリプト自体が不自由なのは変わりないんだけどね。

 
Vladimir:

読み込み後、bool CSVReader::Load(int start_line)の、行の後ろ。

FileClose(filehandle)。

インサートメモリーリリース

ArrayResize(m_cells,m_total_rows*m_total_columns)を使用します。

m_cellsが占有するメモリの0-50%を不要に開放する。m_cells本体のみで、セルの内容は含まれません。

ありがとうございます。しかし、ファイルを閉じたり、スクリプトを終了させたりすると、とにかくメモリはすぐに解放されます。ランニング中の消費量を減らすには...。

 
Aliaksandr Hryshyn:

現在、CSVを素早く処理するための小さなライブラリを作っています。

スクリーンショットには、7秒で通過するテストランがあります!!!!Xeonプロセッサー、周波数3.

まず、スクリプトは各カラムのデータフォーマットを作成する。6つのカラムがあります。そして、1000000行がテーブルに追加され、0から999999までの数字で埋め尽くされます。データ形式によって、数値の捉え方が異なります。そして、すべてがファイルに保存されます。

ファイルサイズは65.4MBです。全体の構成は、メモリに232MBを消費した。

なかなか面白い。プログラミングの成果を公開する予定はありますか?

 
Maxim Dmitrievsky:

まあ、脚本自体は相変わらず雑なんですけどね。

その中で、何を直せばいいのか教えてください。

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