Новая версия платформы MetaTrader 5 build 4755: общие улучшения - страница 13

 
Alain Verleyen #:
Вы хотите сказать, что MT5 показывает добавление частного рабочего набора и размер коммита? Это было бы странно.

Проверка показала, что мы в подсчете потребления памяти используем полную сумму всех используемых страниц памяти процесса.

На основе документации https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-memory_basic_information

  • сканируем все страницы процесса со State = MEM_COMMIT
  • учитываем как занятую все три Type = MEM_IMAGE, MEM_MAPPED и MEM_PRIVATE
  • в результате получаем максимальное потребление с учетом самого тела процесса


Можно было бы пойти по экономному пути и показывать только MEM_PRIVATE, но для нас лучше видеть максимум потребления.

Это позволяет нам явно видеть наш прогресс улучшений по экономии ресурсов.

MEMORY_BASIC_INFORMATION (winnt.h) - Win32 apps
MEMORY_BASIC_INFORMATION (winnt.h) - Win32 apps
  • 2021.04.02
  • GrantMeStrength
  • learn.microsoft.com
Contains information about a range of pages in the virtual address space of a process.
 
Renat Fatkhullin #:

для нас лучше видеть максимум потребления.

Это позволяет нам явно видеть наш прогресс улучшений по экономии ресурсов.

Сейчас в мат. режиме Тестера передать исходные данные возможно только через tester_file-директиву. Это вынуждает на каждом проходе делать FileLoad данных, что заметно замедляет оптимизацию.

Возможно ли данные передавать в виде const-массива, по аналогии с #resource.

#property tester_file "Data.bin" as ulong ArrayIn[]

Соответственно, для Агента (или один общий на всех Агентов одной машины) было бы выделено постоянное (без перевыделения) const ulong[] место в памяти под исходные данные. Сейчас с этим так, что мат. режим существует только формально. Хорошие расчетные объемы не пропустить через него из-за дорогого FileLoad на каждом проходе и выделения на каждый Агент копии const-массива исходных данных.

 

А почему сразу полные данные не включить в компиляцию?

Или файл постоянно меняется и неудобно перекомпилировать?

 
Renat Fatkhullin #:

А почему сразу полные данные не включить в компиляцию?

Или файл постоянно меняется и неудобно перекомпилировать?

Три ограничения.

  1. Если включать в EX5, то приходится бить на куски, т.к. каждый #resource ограничен 128 Mb.
  2. Каждый Агент (одной машины) имеет свою копию одной и той же const-информации. На многоядерке это очень расточительно по памяти.
  3. Данные, действительно, меняются.
 
Renat Fatkhullin # :

Проверка показала, что мы в подсчете потребления памяти используем полную сумму всех используемых страниц памяти процесса.

На основе документации https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-memory_basic_information

  • сканируем все страницы процесса со State = MEM_COMMIT
  • учитываем как занятую все три Type = MEM_IMAGE, MEM_MAPPED и MEM_PRIVATE
  • в результате получаем максимальное потребление с учетом самого тела процесса


Можно было бы пойти по экономному пути и показывать только MEM_PRIVATE, но для нас лучше видеть максимум потребления.

Это позволяет нам явно видеть наш прогресс улучшений по экономии ресурсов.

Понятно. Это имеет смысл.

Спасибо.

 
fxsaber #:

Три ограничения.

  1. Если включать в EX5, то приходится бить на куски, т.к. каждый #resource ограничен 128 Mb.
  2. Каждый Агент (одной машины) имеет свою копию одной и той же const-информации. На многоядерке это очень расточительно по памяти.
  3. Данные, действительно, меняются.

Как минимум, размер максимального ресурса мы точно увеличим.

Сейчас как раз занимаемся компилятором.

 
Renat Fatkhullin #:

Можно было бы пойти по экономному пути и показывать только MEM_PRIVATE, но для нас лучше видеть максимум потребления.

Это позволяет нам явно видеть наш прогресс улучшений по экономии ресурсов.

Возможно ли показывать по F2 совместное с Тестером потребление памяти? Либо в самом Тестере показывать.


Запустил оптимизацию, TaskManager показывает, что памяти хватает.



Запускаю в Терминале простой скрипт, а в Журнале получаю такое.

VirtualAlloc failed in large allocator, size=450066
out of memory in 'Graph.mqh' (468,528)

Смехотвортно, что не смог выделить мизерный объем. Где загвоздка?

 
fxsaber #:

Запустил оптимизацию, TaskManager показывает, что памяти хватает.

В Журнале Тестера такая ерунда.
2025.01.24 07:35:17.424 Core 12 genetic pass (0, 353) tested with error "critical runtime error 502 in OnTester function (array out of range, module Experts\Tester.ex5, file Deal.mqh, line 26, col 16)" in 0:00:24.587
2025.01.24 07:35:44.462 Core 11 genetic pass (0, 324) tested with error "critical runtime error 502 in OnTester function (array out of range, module Experts\Tester.ex5, file Deal.mqh, line 26, col 16)" in 0:00:24.636
2025.01.24 07:36:46.335 Core 07 genetic pass (0, 207) tested with error "no disk space in ticks generating function" in 0:00:16.610

Какие-то явно ошибочные сообщения, потому что 85 гигов свободного на диске. Откуда OutOfRange, когда TaskManager показывает 7 гигов свободного. Все же потребление Тестером ресурсов желательно как-то показывать.

 
fxsaber #:
В Журнале Тестера такая ерунда.

Какие-то явно ошибочные сообщения

CS      3       10:00:47.822    MemoryException 64 Mb not available
CS      3       10:00:47.904    MemoryException 64 Mb not available
CS      0       10:00:47.986    Tester  EURUSD,M1: 0 ticks, 0 bars generated. Environment synchronized in 0:00:00.133. Test passed in 0:00:19.075 (including ticks preprocessing 0:00:18.891).
CS      0       10:00:47.986    Tester  EURUSD,M1: total time from login to stop testing 0:00:19.208 (including 0:00:00.133 for history data synchronization)
CS      3       10:00:47.986    Tester  not enough available memory, 2211 Mb used, 6233 Mb available, maximal available block is 30 Mb
CS      0       10:00:47.986    Tester  log file "C:\Terminals\MT5\Tester\Agent-127.0.0.1-3016\logs\20250124.log" written
CS      0       10:00:47.988    Tester  test Experts\Tester.ex5 on EURUSD,M1 thread finished

Не может выделить 64 Мб, при этом говорит, что есть 6 гигов.

 
fxsaber #:

Не может выделить 64 Мб, при этом говорит, что есть 6 гигов.

Ограничение по к-ву выделяемых блоков?