Fehler, Irrtümer, Fragen - Seite 1593

 
die Rückrufmeldung kommt auf dem Smartphone, im LC und oben auf der μl-Website nicht.
 


Magische Schrift dreht die Zeit um ;-)

Magische Schrift dreht die Zeit um ;-)

 
Vladimir Pastushak:
Das Smartphone erhält eine Meldung über eine Produktbewertung, aber nicht auf dem LC oder oben auf der mcl Website.
Das war schon immer so, ich erinnere mich, dass sie sogar darum gebeten haben, es auf die Website zu stellen, weil es seltsam ist, wenn sie eine Rückmeldung hinterlassen, und selbst wenn sie einem sofort Fragen stellen und man es erst nach 2 Monaten erfährt. :-)
 

Kein Fehler, aber ich kann nicht anders als teilen

Schreiben

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

Compiler gibt eine Warnung aus

ungültiges Datum *****.mq4 115 46

Es wird auch auf gültige Datumsstrings geprüft, ich bin schockiert) (30 Tage im Juni)

 

Offensichtlich interessiert das niemanden, aber ich werde es noch einmal schreiben.

Die eigentliche Aufgabe besteht darin, Arrays mit einer Gesamtgröße von etwa 100 % des freien Speichers zu erstellen, sie schnell mit Zahlen zu füllen, Berechnungen durchzuführen und sie wieder freizugeben.

Ich versuche, die freie Speichergröße mit

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

Ergebnis: 23987 MB, mein physischer Speicher ist 12141 MB, also halb so viel.

Ich weiß, dass diese Zahl für Marsmenschen gilt, aber ich glaube sie trotzdem und schreibe ein Skript, um sie zu testen:

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

Ich erhalte ein logisches Ergebnis - es ist unmöglich, array3 zuzuweisen, weil der Speicher aufgebraucht ist.

Dann entkommentiere ich die Zeile, in der ich angebe, wie viel Speicherplatz jetzt zur Verfügung steht:

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

Danach wird das Skript erfolgreich ausgeführt.

Ich möchte den Entwicklern nicht zur Last fallen, aber es ist wichtig zu wissen, wie viel Speicherplatz verfügbar ist.

Bitte machen Sie es möglich, es durch TerminalInfoInteger zu wissen.

 

Ist Ihnen bewusst, dass Sie in den meisten Fällen nicht den gesamten verfügbaren Speicher abrufen können?

Es gibt so etwas wie eine Speicherfragmentierung. Sie haben beschlossen, den gesamten Speicher in 5 Fragmente aufzuteilen - und das System verfügt über kein einziges ununterbrochenes Speicherfragment in der von Ihnen benötigten Größe.

 
Slawa:

Ist Ihnen bewusst, dass Sie in den meisten Fällen nicht den gesamten verfügbaren Speicher abrufen können?

Es gibt einen solchen Begriff - die Speicherfragmentierung. Sie haben beschlossen, den gesamten Speicher in 5 Fragmente aufzuteilen - aber das System verfügt nicht über ein einziges zusammenhängendes Stück Speicher in der von Ihnen benötigten Größe.

1. Können Sie zunächst herausfinden, was der Parameter TERMINAL_MEMORY_AVAILABLE physisch bedeutet?

2. Was die Fragmente betrifft, so sollte dies meiner Meinung nach vom Windows-Speichermanager gehandhabt werden, nicht vom Programmierer.

Ich muss wissen, wie viel ich zu einem bestimmten Zeitpunkt nutzen kann, z. B. möchte ich 50 % des verfügbaren Speichers nutzen.

Eine weitere echte Aufgabe ist die CopyTicks-Anfrage. Wenn Sie mehr Ticks anfordern, als Speicherplatz zur Verfügung steht, erhalten Sie "out of memory".

 
Andrey Voytenko:

Eine weitere echte Herausforderung ist die CopyTicks-Anfrage. Wenn Sie mehr Ticks anfordern, als Speicherplatz zur Verfügung steht, erhalten Sie "out of memory".

Alternativ können Sie die Daten in eine Datei entladen und von dort in den gewünschten Segmenten übernehmen
 
coderex:
Alternativ können Sie die Daten in eine Datei hochladen und von dort die gewünschten Segmente übernehmen

Das ist zu langsam für mich. Ich möchte alles aus dem Gedächtnis machen. Eigentlich wird es jetzt gemacht, aber ich muss GlobalMemoryStatusEx aufrufen, um die Größe des verfügbaren Speichers zu erfahren.


	          
 
Andrey Voytenko:

Dieses Problem ist besonders akut, wenn man auf Cloud-Agenten optimiert, über deren Fähigkeiten man von Anfang an nichts weiß. Es ist unmöglich, die tatsächliche Menge an verfügbarem Speicher dort zu bestimmen, weder durch MQL noch durch WinApi (weil dll-Aufrufe verboten sind).

Es ist wirklich unklar, welchen praktischen Sinn TERMINAL_MEMORY_AVAILABLE dann noch hat. Warum sollten wir es einführen, wenn es uns weder glücklich noch unglücklich macht?

Grund der Beschwerde: