오류, 버그, 질문 - 페이지 1593

 
제품 리콜에 대한 스마트 메시지가 오면 LC와 웹 사이트 상단에 cl이 없습니다.
 


매직 스크립트는 시간을 되돌립니다 ;-)

매직 스크립트는 시간을 되돌립니다 ;-)

 
Vladimir Pastushak :
제품 리콜에 대한 스마트 메시지가 오면 LC와 웹 사이트 상단에 cl이 없습니다.
항상 이랬어요, 어디선가 저에게 사이트에서 해보라고 했던 기억이 납니다. 후기를 남겨도 이상하고, 바로 물어봐도 2개월이 지나야 알게 되는 게 이상해서요. :-)
 

버그는 아니지만 공유해야합니다

쓰기

 if ((!IsRunOnTester() && TimeCurrent () >= D'2016.06.31 23:59' )) // для тестировщиков, ограничение работы по времени

컴파일러는 경고를 발행합니다.

잘못된 날짜 *****.mq4 115 46

그것은 또한 날짜의 정확성에 대한 문자열 날짜를 확인합니다, 나는 충격을 받았습니다) (6월 30일)

 

분명히 이것은 아무도 귀찮게하지 않지만 여전히 다시 쓸 것입니다.

실제 작업: 사용 가능한 메모리의 총 크기가 약 100%인 배열을 만들고 빠르게 숫자로 채우고 계산을 수행하고 해제합니다.

나는 사용 가능한 메모리의 양을 얻으려고합니다.

 int mem_free_mb=( int ) TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE );

결과: 23987MB, 12141MB의 실제 메모리가 있습니다. 두 배 작습니다.

나는 이 수치가 화성인을 위한 것이라는 것을 이해하지만 여전히 그것을 테스트하기 위해 스크립트를 믿고 작성합니다.

 //+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
#define PARTS 5

   srand ( GetTickCount ());
//---
   int mem_free_mb=( int ) TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE );
   //mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.
   long mem_for_calc=( long )(( double )mem_free_mb* 1024 * 1024 );
   long mem_one_part=( long ) floor (( double )mem_for_calc/PARTS);
   if (mem_one_part>= INT_MAX - 1 )
      mem_one_part= INT_MAX - 1 ;
//---
   printf ( "Memory for calc: %0.f MB, parts: %d, part: %0.f MB" ,mem_for_calc/ 1024 / 1024 ,PARTS,mem_one_part/ 1024 / 1024 );
   char array1[];
   char array2[];
   char array3[];
   char array4[];
   char array5[];

   int res= ArrayResize (array1,( int )mem_one_part);
   Print ( "Array1 Resize: " ,res);
   if (res< 1 ) return ;
   printf ( "Reserved: %0.f MB" , 1.0 *mem_one_part/ 1024 / 1024 );

   res= ArrayResize (array2,( int )mem_one_part);
   Print ( "Array2 Resize: " ,res);
   if (res< 1 ) return ;
   printf ( "Reserved: %0.f MB" , 2.0 *mem_one_part/ 1024 / 1024 );

   res= ArrayResize (array3,( int )mem_one_part);
   Print ( "Array3 Resize: " ,res);
   if (res< 1 ) return ;
   printf ( "Reserved: %0.f MB" , 3.0 *mem_one_part/ 1024 / 1024 );

   res= ArrayResize (array4,( int )mem_one_part);
   Print ( "Array4 Resize: " ,res);
   if (res< 1 ) return ;
   printf ( "Reserved: %0.f MB" , 4.0 *mem_one_part/ 1024 / 1024 );

   res= ArrayResize (array5,( int )mem_one_part);
   Print ( "Array5 Resize: " ,res);
   if (res< 1 ) return ;
   printf ( "Reserved: %0.f MB" , 5.0 *mem_one_part/ 1024 / 1024 );

   uint gtc= GetTickCount ();
   for ( int i= 0 ;i<mem_one_part;i++)
     {
       char ch=( char ) rand ();
      array1[i]=ch;
      array2[i]=ch;
      array3[i]=ch;
      array4[i]=ch;
      array5[i]=ch;
     }
//---
   printf ( "Spent time: %d ms" , GetTickCount ()-gtc);
  }

나는 일반적인 결과를 얻습니다 - array3 배열을 배포하는 것은 불가능합니다. 왜냐하면 메모리가 끝났습니다.

그런 다음 현재 사용 가능한 양을 나타내는 행의 주석 처리를 제거합니다.

mem_free_mb= 5300 ; //<--- Столько показывает 'Доступной' в диспетчере задач.

그런 다음 스크립트가 성공적으로 실행됩니다.

개발자를 귀찮게 하고 싶지는 않지만 메모리 관리를 위해서는 사용 가능한 용량을 아는 것이 중요합니다.

이것을 TerminalInfoInteger 를 통해 알 수 있게 해주세요.

 

대부분의 경우 사용 가능한 모든 메모리를 얻을 수 없다는 것을 알고 계십니까?

메모리 단편화와 같은 것이 있습니다. 모든 메모리를 5개의 조각으로 나누기로 결정했지만 시스템에 필요한 크기의 연속적인 단일 메모리 조각이 없습니다.

 
Slawa :

대부분의 경우 사용 가능한 모든 메모리를 얻을 수 없다는 것을 알고 계십니까?

메모리 단편화와 같은 것이 있습니다. 모든 메모리를 5개의 조각으로 나누기로 결정했지만 시스템에 필요한 크기의 연속적인 단일 메모리 조각이 없습니다.

1. 먼저 TERMINAL_MEMORY_AVAILABLE 매개변수가 물리적으로 무엇을 의미하는지 알 수 있습니까?

2. 프래그먼트에 관해서는 프로그래머가 아닌 Windows 메모리 관리자가 수행해야 한다고 생각합니다.

내가 현재 사용할 수 있는 양을 아는 것이 중요합니다. 예를 들어 사용 가능한 메모리의 50%를 사용하고 싶습니다.

또 다른 실제 과제는 CopyTicks 요청입니다. 사용 가능한 메모리보다 더 많은 틱을 요청하면 '메모리 부족'이 발생합니다.

 
Andrey Voytenko :

또 다른 실제 과제는 CopyTicks 요청입니다. 사용 가능한 메모리보다 더 많은 틱을 요청하면 '메모리 부족'이 발생합니다.

옵션으로 데이터를 파일에 업로드하고 거기에서 필요한 세그먼트를 가져옵니다.
 
coderex :
옵션으로 데이터를 파일에 업로드하고 거기에서 필요한 세그먼트를 가져옵니다.

이것은 나를 위해 느립니다. 나는 모든 것을 기억으로 하고 싶다. 실제로 이것은 지금 수행되고 있습니다. GlobalMemoryStatusEx를 호출하고 사용 가능한 크기를 알아내기만 하면 됩니다.


	          
 
Andrey Voytenko :

나는 지원한다. 이 문제는 클라우드 에이전트에서 최적화할 때 특히 심각합니다. 처음에는 그 기능에 대해 전혀 알지 못합니다. 거기에서 MQL이나 WinApi를 통해 사용 가능한 메모리의 실제 양을 결정하는 것은 불가능합니다(dll 호출이 금지되어 있기 때문에).

그렇다면 TERMINAL_MEMORY_AVAILABLE에 어떤 실질적인 의미가 있는지 명확하지 않습니까? 덥지도 춥지도 않은데 왜 도입되었을까