Ошибки, баги, вопросы - страница 3558

 

Что это значит?

2024.07.24 22:28:09.909 MQL5    VirtualAlloc failed in large allocator, size=17087594608
2024.07.24 22:28:32.922 MQL5    VirtualAlloc failed in large allocator, size=15509967784
2024.07.24 22:35:19.423 MQL5    VirtualAlloc failed in large allocator, size=13194711952
2024.07.24 22:42:11.706 MQL5    VirtualAlloc failed in large allocator, size=14125808776
 
Aleksey Vyazmikin # :

Что это значит?

Вы используете FileReadArray()?

 
Alain Verleyen #:
FileReadArray

Да. Такие сообщения не всегда бывают. Работа скрипта не останавливается.

 
не знаю куда такое писать, вроде бы эта тема больше подходит, откуда у меня взялся бан на 10 лет? вроде бы ни за что накинули  (сегодня также снялся) Хотел ответить человеку тогда в своей теме.
 
Mickey Moose #:
не знаю куда такое писать, вроде бы эта тема больше подходит, откуда у меня взялся бан на 10 лет? вроде бы ни за что накинули  (сегодня также снялся) Хотел ответить человеку тогда в своей теме.

Ну Вы же пишете, а значит - нет бана.

Если видите в профиле бан, перезагрузите роутер - наверняка у него динамический IP, и просто текущий попал на забаненный адрес. После перезагрузки роутера, IP сменится, и бана не будет.

 

Правильно ли я понимаю, что при вызове метода withPtr() указатель будет проверен количество раз, равное размеру массива m_a.x[], а при вызове метода withRef() указатель будет проверен только 1 раз?

class A
  {
public:
   long x[];
  };

#define _methodBody(arr)                  \
   long result = 0;                       \
   for(int i = _sizeOfX - 1; i >= 0; i--) \
      result += arr[i];                   \
   return(result);

class B
  {
public:
   long withPtr()             { _methodBody(m_a.x) }
   long withRef(const A& obj) { _methodBody(obj.x) }
private:
   const A*const m_a;
public:
         B(A* ptr) : m_a(ptr) {}
  };

Полный код прикрепил в виде скрипта. Скрипт сравнивает скорость выполнения методов  withPtr() и withRef().

Для десяти миллионов обращений withRef() показывает примерно пятикратное ускорение (режим компиляции: maximum optimization):

B::testWithPtr: 25947
B::testWithRef: 4856
Файлы:
 
Aleksey Vyazmikin # :

Да. Такие сообщения не всегда бывают. Работа скрипта не останавливается.

Мне потребовалось много времени, чтобы обнаружить, что сообщение «Ошибка VirtualAlloc» связано с FileReadArray(), поскольку это происходило редко.

Это произошло из-за изменения в файле данных, которое привело к чтению за конец файла. Вы можете обнаружить это, поскольку оно вернет ошибку:

ERR_ARRAY_RESIZE_ERROR

4007

Недостаточно памяти для перемещения массива или попытка изменить размер статического массива

 
Artyom Trishkin #:

Ну Вы же пишете, а значит - нет бана.

Если видите в профиле бан, перезагрузите роутер - наверняка у него динамический IP, и просто текущий попал на забаненный адрес. После перезагрузки роутера, IP сменится, и бана не будет.

Да, роутер с динамик. айпи. Спасибо.




Такой тут ещё впрос. достал я советник, закинул в тестер мт5, он долго думал потом сказал инит файлед.. Но он рабочий. Перекинул на другой комп - работает всё ок. Перегррузил свой- тоже работает, они по ходу как то связаны с оперативной памятью или нет? Если её очистить под 0 то тоже ошибка исчезает.

 
Vladislav Boyko #:

Правильно ли я понимаю, что при вызове метода withPtr() указатель будет проверен количество раз, равное размеру массива m_a.x[], а при вызове метода withRef() указатель будет проверен только 1 раз?

Полный код прикрепил в виде скрипта. Скрипт сравнивает скорость выполнения методов  withPtr() и withRef().

Для десяти миллионов обращений withRef() показывает примерно пятикратное ускорение (режим компиляции: maximum optimization):

Вы использовали лайфхак преобразования указателя в объект.

class A {};

void f( A& ) {}
void g( A*& ) {}

void OnStart()
{
  A* a = NULL;
  
  f(a); // OK - ??
  g(a); // OK
}

Тем самым обнулив проверку указателя на каждой итерации цикла. Выглядит, как ошибка языка, приводящая к ускорению.

 
Alain Verleyen #:
Это произошло из-за изменения в файле данных, которое привело к чтению за конец файла.

Не понял, т.е. файл слишком большой и не хватило памяти ОЗУ? По факту файл не большой и уменьшается в процессе работы скрипта.

Вот функция чтения - раньше не замечал подобных сообщений - активно использую не менее года.

//+------------------------------------------------------------------+
//Загрузка выборки в формате bin
//+------------------------------------------------------------------+
void Load_Data(int v)
{
//---Загрузка выборки из bin файла
   int Strok_Total_Data_Load=0;
   int Stolb_Total_Data_Load=0;
   int Size_arr_LoadData=0;
   string Dir="";
   if(Use_Temp_Dir==true && Load!=Dir_Q)
   {
      switch(v)
      {
      case 0:
         Dir=Dir_Q+"_TMP\\Setup\\train.bin";
         break;
      case 1:
         Dir=Dir_Q+"_TMP\\Setup\\test.bin";
         break;
      case 2:
         Dir=Dir_Q+"_TMP\\Setup\\exam.bin";
         break;
      }
   }
   else
   {
      switch(v)
      {
      case 0:
         Dir=Load+"\\Setup\\train.bin";
         break;
      case 1:
         Dir=Load+"\\Setup\\test.bin";
         break;
      case 2:
         Dir=Load+"\\Setup\\exam.bin";
         break;
      }
   }

   int h=FileOpen(Dir,FILE_READ|FILE_BIN|FILE_SHARE_READ|FILE_COMMON);//Загрузим файл
   if(h==INVALID_HANDLE)
   {
      Print("Ошибка открытия файла - ",Dir);
   }

   Strok_Total_Data_Load=FileReadInteger(h,INT_VALUE); // считываем значение
   Stolb_Total_Data_Load=FileReadInteger(h,INT_VALUE); // считываем значение
   Size_arr_LoadData=FileReadInteger(h,INT_VALUE); // считываем значение

   ArrayResize(arr_Data,Size_arr_LoadData);
   ArrayResize(arr_Load_Time,Strok_Total_Data_Load);
   ArrayResize(arr_Load_Target_P,Strok_Total_Data_Load);
   ArrayResize(arr_Target,Strok_Total_Data_Load);
   ArrayResize(arr_Load_Target_100_Buy,Strok_Total_Data_Load);
   ArrayResize(arr_Load_Target_100_Sell,Strok_Total_Data_Load);

   FileReadArray(h,arr_Data,0,Size_arr_LoadData); // считаем  массив заданное количество элементов

   int Size_arr_Bin=0;//Размер массива для считывания

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Time,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Target_P,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Target,0,Size_arr_Bin); // считаем  массив arr_Load_Target_100 заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Target_100_Buy,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Target_100_Sell,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   int Size_arr_Zagalovki=0;
   Size_arr_Zagalovki=FileReadInteger(h,INT_VALUE); // считываем значение
   Print("Size_arr_Zagalovki=",Size_arr_Zagalovki);
   ArrayResize(arr_Zagalovki,Size_arr_Zagalovki); // изменение размера массива
   int Size_str=0;//Длина строки
   for(int i=0; i<Size_arr_Zagalovki; i++) // по всем элементам массива
   {
      Size_str=FileReadInteger(h,INT_VALUE); // чтение размере строки
      arr_Zagalovki[i]=FileReadString(h,Size_str); // чтение строки
   }
   FileClose(h);

   Strok_Total_Data=Strok_Total_Data_Load;
   Stolb_Total_Data=Stolb_Total_Data_Load;
}