Hatalar, hatalar, sorular - sayfa 1593

 
Ürünün geri çağrılmasıyla ilgili akıllı mesajda, LC'de ve web sitesinin üst kısmında cl yok.
 


Sihirli senaryo zamanı geri alır ;-)

Sihirli senaryo zamanı geri alır ;-)

 
Vladimir Pastushak :
Ürünün geri çağrılmasıyla ilgili akıllı mesajda, LC'de ve web sitesinin üst kısmında cl yok.
her zaman böyleydi, hatta bir yerde sitede yapmamı istediklerini hatırlıyorum - çünkü sizin için yorum bırakmaları garip ve hemen soru sorsalar ve sadece 2 ay sonra öğreniyorsunuz. :-)
 

Hata değil ama paylaşmak zorundayım

yazı

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

Derleyici bir uyarı verir

geçersiz tarih *****.mq4 115 46

Ayrıca tarihin doğruluğu için dize tarihlerini kontrol eder, şok oldum) (30 Haziran gün)

 

Görünüşe göre bu kimseyi rahatsız etmiyor, ama yine de tekrar yazacağım.

Gerçek görev: toplam boyutu yaklaşık %100 boş belleğe sahip diziler oluşturun, bunları hızla sayılarla doldurun, hesaplamalar yapın ve serbest bırakın.

Boş hafıza miktarını almaya çalışıyorum

 int mem_free_mb=( int ) TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE );

sonuç: 23987 MB ve 12141 MB fiziksel belleğim var, yani. iki kat daha küçük.

Bu rakamın Marslılar için olduğunu anlıyorum, ancak yine de bunu test etmek için bir senaryo yazıyorum ve inanıyorum:

 //+------------------------------------------------------------------+
//| 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);
  }

Düzenli bir sonuç alıyorum - dizi3 dizisini dağıtmak imkansız çünkü hafıza bitti.

Ardından, şu anda ne kadar mevcut olduğunu belirttiğim satırın yorumunu kaldırıyorum:

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

Bundan sonra, komut dosyası başarıyla çalışır.

Geliştiriciler için can sıkıcı olmak istemiyorum, ancak bellek yönetimi için ne kadar kullanılabilir olduğunu bilmek önemlidir.

Lütfen bunu TerminalInfoInteger aracılığıyla bilmeyi mümkün kılın.

 

Çoğu durumda kullanılabilir belleğin tamamını alamayacağınızın farkında mısınız?

Bellek parçalanması diye bir şey var. Tüm belleği 5 parçaya bölmeye karar verdiniz - ancak sistemde ihtiyacınız olan boyutta tek bir sürekli bellek parçası yok

 
Slawa :

Çoğu durumda kullanılabilir belleğin tamamını alamayacağınızın farkında mısınız?

Bellek parçalanması diye bir şey var. Tüm belleği 5 parçaya bölmeye karar verdiniz - ancak sistemde ihtiyacınız olan boyutta tek bir sürekli bellek parçası yok

1. Önce TERMINAL_MEMORY_AVAILABLE parametresinin fiziksel olarak ne anlama geldiğini bulabilir misiniz?

2. Parçalara gelince, bunun programcı tarafından değil, Windows bellek yöneticisi tarafından yapılması gerektiğini düşünüyorum.

Şu anda ne kadar kullanabileceğimi bilmek benim için önemli, örneğin mevcut belleğin %50'sini kullanmak istiyorum.

Diğer bir gerçek zorluk ise CopyTicks isteğidir. Kullanılabilir bellekten daha fazla onay talep edersek, 'bellek yetersiz' olur.

 
Andrey Voytenko :

Diğer bir gerçek zorluk ise CopyTicks isteğidir. Kullanılabilir bellekten daha fazla onay talep edersek, 'bellek yetersiz' alırız.

bir seçenek olarak, verileri bir dosyaya yükleyin ve oradan gerekli segmentleri alın
 
coderex :
bir seçenek olarak, verileri bir dosyaya yükleyin ve oradan gerekli segmentleri alın

Bu benim için yavaş. Her şeyi hafızadan yapmak istiyorum. Aslında bu şu anda yapılıyor, sadece GlobalMemoryStatusEx'i aramanız ve mevcut olanın boyutunu öğrenmeniz gerekiyor.


	          
 
Andrey Voytenko :

Desteklerim. Bu sorun, yetenekleri hakkında başlangıçta hiçbir şey bilmediğiniz bulut aracılarını optimize ederken özellikle akuttur. Orada, MQL veya WinApi aracılığıyla gerçek kullanılabilir bellek miktarını belirlemek imkansızdır (çünkü dll çağrıları yasaktır).

TERMINAL_MEMORY_AVAILABLE'ın pratik anlamının ne olduğu gerçekten açık değil mi? Ondan ne sıcak ne de soğuk değilsek neden tanıtıldı?