MT5 RAM의 메모리 폭식, 대용량 파일 읽기/쓰기 문제 - 페이지 6

 
Vladimir :

메모리 재할당이 덜 자주 수행되도록 먼저 최소한의 변경을 수행하는 것이 좋습니다. 두 줄

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

bool CSVReader::AddData( 문자열 data_str, bool 헤더)에서 다음으로 대체

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))여야 합니다. 600,000 대신 20. 어쩌면 이것은 이미 당신에게 충분합니다.

고맙습니다! 무슨 일이 있었는지 알려주세요:

1. 메모리에는 변경 사항이 없습니다. 현재 코드는 여기저기서 10GB의 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를 날짜를 뺀 바이너리로 변환했습니다.

작동 중에 메모리 스크립트가 1GB를 먹었는데, 이는 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 :

메모리 재할당이 덜 자주 수행되도록 먼저 최소한의 변경을 수행하는 것이 좋습니다. 두 줄

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

bool CSVReader::AddData( 문자열 data_str, bool 헤더)에서 다음으로 대체

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))여야 합니다. 600,000 대신 20. 어쩌면 이것은 이미 당신에게 충분합니다.

사실 ArrayResize() 의 세 번째 매개변수는 그렇게 지정하기가 쉽지 않습니다... 젠장 변경...

문서 읽기

 
Roffild :

사실 ArrayResize()의 세 번째 매개변수는 그렇게 지정하기가 쉽지 않습니다... 젠장 변경...

문서 읽기

메모리 .csv로 들어 올리는 문제가 다른 프로그램에서 생성되고 임의의 크기를 가질 때 이 경우에 유용한 세 번째 매개변수에 대한 문서에서 무엇을 수집했습니까?

바이너리 검색보다 더 나은, 쓰레기가 아닌 성능 향상 메모리 재할당( ArrayResize에 대한 호출 수 줄이기 )을 자유롭게 제안하십시오...

 
Aleksey Vyazmikin :

고맙습니다! 무슨 일이 있었는지 알려주세요:

1. 메모리에는 변경 사항이 없습니다. 현재 코드는 여기저기서 10GB의 RAM을 먹었습니다.

2. 속도별:

2.1 구버전 574초

2.2 새 버전 138초

4배 증가한 것으로 나타났습니다. 이는 매우 좋은 일입니다! 그러나 메모리는 백투백이며 로드해야 할 모든 것과는 거리가 멉니다....

읽은 후 bool CSVReader::Load( int start_line) 행 뒤

파일 닫기 (파일 핸들);

여유 메모리 삽입

배열 크기 조정 (m_cells,m_total_rows*m_total_columns);

m_cells가 차지하는 메모리의 불필요한 0-50%를 해제합니다. 셀의 내용 없이 m_cells 자체만.

 

이제 CSV로 빠른 작업을 위해 작은 라이브러리를 만들고 있습니다.

화면에는 7초가 소요되는 작업 테스트가 있습니다!!! Xeon 프로세서, 3.0 주파수.

먼저 스크립트는 각 열에 대한 데이터 형식을 생성합니다. 열 6. 그런 다음 1000000 행이 테이블에 추가 된 다음 0에서 999999 사이의 숫자로 채워집니다. 데이터 형식에 따라 숫자는 다른 방식으로 인식 될 수 있습니다. 그런 다음 모든 것이 파일에 저장됩니다.

파일 크기 65.4MB 메모리의 전체 구조는 232MB를 차지했습니다.

 
Aleksey Vyazmikin :

CSV를 날짜를 뺀 바이너리로 변환했습니다.

작동 중에 메모리 스크립트가 1GB를 먹었는데, 이는 10에 비해 매우 좋습니다. 그래도 양이 많아요 :)

속도면에서 - 단 16초! 아주 멍청하지 않아!

글쎄, 대본 자체는 여전히 서툴다.

 
Vladimir :

읽은 후 bool CSVReader::Load( int start_line) 행 뒤

파일 닫기 (파일 핸들);

여유 메모리 삽입

배열 크기 조정 (m_cells,m_total_rows*m_total_columns);

m_cells가 차지하는 메모리의 불필요한 0-50%를 해제합니다. 셀의 내용 없이 m_cells 자체만.

감사합니다. 그러나 파일을 닫고/스크립트를 마친 후에는 어쨌든 메모리가 빠르게 해제됩니다. 작동 중 소비를 줄이는 방법은 다음과 같습니다....

 
Aliaksandr Hryshyn :

이제 CSV로 빠른 작업을 위해 작은 라이브러리를 만들고 있습니다.

화면에는 7초가 소요되는 작업 테스트가 있습니다!!! Xeon 프로세서, 3.0 주파수.

먼저 스크립트는 각 열에 대한 데이터 형식을 생성합니다. 열 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 ])
                    );
     }
  }