Неверное отображение доступной оперативной памяти для терминала

 

При вызове функции

TerminalInfoInteger ( TERMINAL_MEMORY_TOTAL ) и

TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE ) 

терминал выдает значения, которые в 2 раза превышают объем физической памяти компьютера, при этом в системе отключен pagefile.sys для сброса данных оперативной памяти на диск, соответственно такого объема даже со свопом нет в доступе для терминала.

Тестировал на 3х машинах: с 8 Gb оперативной памяти (виртуалка VMWare), с 16 Gb ( не виртуалка ) и 32 Gb ( не виртуалка )

Операционная система Windows 2008 R2 Datacenter

Версии терминала 5.00 build 2815 и  5.00 build 2833


Подскажите, может есть какая-либо другая функция для определения свободной памяти для эксперта, чтоб не получать отказ в выделении памяти для массива?

 
Aleksandr Matveev:

При вызове функции TerminalInfoInteger ( TERMINAL_MEMORY_TOTAL ) и   TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE ) 

терминал выдает значения, которые в 2 раза превышают объем физической памяти компьютера, при этом в системе отключен pagefile.sys для сброса данных оперативной памяти на диск, соответственно такого объема даже со свопом нет в доступе для терминала.

Тестировал на 3х машинах с 8 Gb оперативной памяти (виртуалка VMWare), с 16 Gb ( не виртуалка ) и 32 Gb ( не виртуалка )

Операционная система Windows 2008 R2 Datacenter

Версии терминала 5.00 build 2815 и  5.00 build 2833


Подскажите, может есть какая-либо другая функция для определения свободной памяти для эксперта, чтоб не получать отказ в выделении памяти для массива?

Первое приближение можно получить как TERMINAL_MEMORY_PHYSICAL - TERMINAL_MEMORY_USED

 
JRandomTrader:

Первое приближение можно получить как TERMINAL_MEMORY_PHYSICAL - TERMINAL_MEMORY_USED

Благодарю, конечно, за ответ, но это не дает никакой информации о том, сколько занято памяти другими программами в системе. 

Пока я сделал костыль в виде цикла от как раз этой цифры (  TERMINAL_MEMORY_PHYSICAL - TERMINAL_MEMORY_USED ), в котором происходит выделение памяти под массив, уменьшая каждый раз значение на Гигабайт при невозможности выделить память, как только память выделяется успешно -> заносим это значение в переменную, как значение свободной памяти и делаем ArrayFree для массива.

Но это как-то не серьезно, когда нужно часто проверять доступную память, т.к. само выделение памяти под временный массив занимает время.
 
Aleksandr Matveev:

Благодарю, конечно, за ответ, но это не дает никакой информации о том, сколько занято памяти другими программами в системе. 

Пока я сделал костыль в виде цикла от как раз этой цифры (  TERMINAL_MEMORY_PHYSICAL - TERMINAL_MEMORY_USED ), в котором происходит выделение памяти под массив, уменьшая каждый раз значение на Гигабайт при невозможности выделить память, как только память выделяется успешно -> заносим это значение в переменную, как значение свободной памяти и делаем ArrayFree для массива.

Но это как-то не серьезно, когда нужно часто проверять доступную память.

А если не выделилось из-за фрагментации свободной памяти? Или она как-то дефрагментируется?

 
JRandomTrader:

А если не выделилось из-за фрагментации свободной памяти? Или она как-то дефрагментируется?

В Windows 7 и выше эта проблема решена и ей занимается менеджер памяти операционной системы, на сколько я помню.

Там же пользователю даются виртуальные адреса, а не физические, физически память может быть и фрагментирована, а для пользователя это не видно и ему показывается непрерывный кусок памяти с адресацией по порядку от начала до конца.
 
Aleksandr Matveev:

В Windows 7 и выше эта проблема решена и ей занимается менеджер памяти операционной системы, на сколько я помню.

Там же пользователю даются виртуальные адреса, а не физические, физически память может быть и фрагментирована, а для пользователя это не видно.

А МТ отдаёт освобождённую память в систему, не сам управляет?

 
JRandomTrader:

А МТ отдаёт освобождённую память в систему, не сам управляет?

Конечно отдает системе (освобождает), это легко проверяется выполнением ArrayFree и просмотром в любом диспетчере памяти, сколько выделено под MT5

 
Aleksandr Matveev:

При вызове функции TerminalInfoInteger ( TERMINAL_MEMORY_TOTAL ) и   TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE ) 

терминал выдает значения, которые в 2 раза превышают объем физической памяти компьютера, при этом в системе отключен pagefile.sys для сброса данных оперативной памяти на диск, соответственно такого объема даже со свопом нет в доступе для терминала.

Тестировал на 3х машинах с 8 Gb оперативной памяти (виртуалка VMWare), с 16 Gb ( не виртуалка ) и 32 Gb ( не виртуалка )

Операционная система Windows 2008 R2 Datacenter

Версии терминала 5.00 build 2815 и  5.00 build 2833


Подскажите, может есть какая-либо другая функция для определения свободной памяти для эксперта, чтоб не получать отказ в выделении памяти для массива?

Поставте Windows XP ...

А если серьёзно то пользуйтесь актуальной операционной системой с последними обновлениями.

 
Вы хотите пользоваться новыми программами и функциями, но не хотите свою систему обновлять 15 лет. Где логика ?
 
Volodymyr Zubov:

Поставте Windows XP ...

А если серьёзно то пользуйтесь актуальной операционной системой с последними обновлениями.

Как это относится к теме ветки? Пожалуйста придерживайтесь темы. У меня не было вопроса о том, какую операционную систему мне использовать.

Есть конкретная проблема и ее нужно решить, по другим вопросам пожалуйста создавайте отдельную тему и там обсуждайте или найдите существующую тему в которой можете поговорить о наболевшем. 
 
Aleksandr Matveev:

Благодарю, конечно, за ответ, но это не дает никакой информации о том, сколько занято памяти другими программами в системе. 

Пока я сделал костыль в виде цикла от как раз этой цифры (  TERMINAL_MEMORY_PHYSICAL - TERMINAL_MEMORY_USED ), в котором происходит выделение памяти под массив, уменьшая каждый раз значение на Гигабайт при невозможности выделить память, как только память выделяется успешно -> заносим это значение в переменную, как значение свободной памяти и делаем ArrayFree для массива.

Но это как-то не серьезно, когда нужно часто проверять доступную память, т.к. само выделение памяти под временный массив занимает время.
Это не костыль, а прямое убийство терминала.

Не делайте так никогда и ни в одной программе
Причина обращения: