Вопрос по оптимизации использования оперативной памяти.

 

При создании новых версий программы возникает необходимость преобразовывать базы данных, созданные старыми версиями программы, в новый формат. 

Для этого в программе создается кусок кода для этого преобразования. Этот кусок кода используется однократно. И после преобразования данных он становится ненужным.

Программа занимает 2,6 мегабайта. При добавлении кода преобразования данных размер ее увеличивается. Увеличение размера программы может быть заметным. Программа (индикатор) запускается на всех открытых графиках. Некоторые трейдеры запускают ее по 9 экземпляров на одном графике. Неиспользуемый код суммарно может занимать значительный объем оперативной памяти.

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

Ранее неоднократно делал такие преобразования. Но изменения были небольшие и код занимал мало места. Назрела необходимость сделать значительные преобразования. Код может занимать заметный объем.

Вопрос. 

Есть ли возможность участок кода программы, который используется однократно, скажем так, удалять из памяти? Или же указывать операционной системе, что оперативная память с участком кода с однократным использованием свободна для использования другими процессами.

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

 

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

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

 
Eugeni Neumoin:

При создании новых версий программы возникает необходимость преобразовывать базы данных, созданные старыми версиями программы, в новый формат. 

Для этого в программе создается кусок кода для этого преобразования. Этот кусок кода используется однократно. И после преобразования данных он становится ненужным.

Программа занимает 2,6 мегабайта. При добавлении кода преобразования данных размер ее увеличивается. Увеличение размера программы может быть заметным. Программа (индикатор) запускается на всех открытых графиках. Некоторые трейдеры запускают ее по 9 экземпляров на одном графике. Неиспользуемый код суммарно может занимать значительный объем оперативной памяти.

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

Ранее неоднократно делал такие преобразования. Но изменения были небольшие и код занимал мало места. Назрела необходимость сделать значительные преобразования. Код может занимать заметный объем.

Вопрос. 

Есть ли возможность участок кода программы, который используется однократно, скажем так, удалять из памяти? Или же указывать операционной системе, что оперативная память с участком кода с однократным использованием свободна для использования другими процессами.

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

Ответ :

если у вас "Клиентов, использующих программу, несколько десятков тысяч. " то преобразований делать не надо. Это даже вредно. При ворочании мешков главное не повредить спину.

 
Maxim Kuznetsov:

Ответ :

если у вас "Клиентов, использующих программу, несколько десятков тысяч. " то преобразований делать не надо. Это даже вредно. При ворочании мешков главное не повредить спину.

Много раз проделывал это. Все проходило чисто. Жалоб не поступало, потому что никто ничего не заметил.

Есть такой принцип при создании программ. В новой версии клиент не должен испытывать дискомфорт по сравнению со старой версией.


А проблема нововведения возникла по следующей причине. Один клиент из-за отсутствия вводимого изменения потребовал вернуть деньги. Пришлось маркету деньги вернуть.

А запрашиваемое нововведение действительно полезное.

=================

Желательно не создавать спам... 

 
Вынести логику в отдельный ex4/ex5 файл, подключаемый к проекту через #import. Если разработчики не изобретали велосипед, то поведение должно быть то же, что и с dll.
 

Программы из библиотек динамической загрузки разработчики периодически удаляют из оперативной памяти по какому-то секретному алгоритму. Попробуйте перенести код в DLL - возможно, при Ваших объёмах, это поможет. 

А вообще, в таких случаях возникает ностальгия по оверлейной структуре программы, когда всё легко делалось руками (

 
Новый код оформить в виде класса. При запуске программы создать экземпляр этого класса. По окончании работы  этого участка кода удалить инстанс. 
 
Костыль...
 

Было бы интересно такое решение. Какой-то директивой задается участок кода, который копмонуется в определенном месте в памяти. Все участки кода, ограниченные данной директивой в этом участке памяти концентрируются. 

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

Мне кажется, такой механизм может пригодиться для многих применений. Не знаю, возможно ли такое создать. Хотя... Если есть задача, то она решаема. 

==========

Программы для маркета должны удовлетворять определенным условиям. Все должно быть в одном запускаемом файле.

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

Возможно, сделаю так. Для маркета размещу промежуточную версию. Программа из маркета автоматически будет установлена у всех, кто приобретал ее или скачивал, когда она была бесплатной. И у всех произойдет преобразование данных в папке Files.   Через некоторое время туда помещу версию с удаленным кодом. 

И на каких-то сайтах размещу эти же версии для свободного скачивания. Там же и сделаю описание. Статьи нет желания создавать. Тем более, в статьях получаются какие-то огрызки. В сравнении с реальными возможностями...

 
Eugeni Neumoin:

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

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


ну или использовать ООП и создавать динамические обьекты - но тут будет выигрыш только на размер полей класса, сами тела методов все равно будут включены в исполняемый файл


ЗЫ: по моему речь идет об оверлеях, в Турбо-Паскале была когда то такая штука, но в те времена и проблемы были другие - памяти на ПК было 640 кБ для реального режима

 
Igor Makanu:

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


ну или использовать ООП и создавать динамические обьекты - но тут будет выигрыш только на размер полей класса, сами тела методов все равно будут включены в исполняемый файл


ЗЫ: по моему речь идет об оверлеях, в Турбо-Паскале была когда то такая штука, но в те времена и проблемы были другие - памяти на ПК было 640 кБ для реального режима

Проблема вообще не решаема на уровне компилятора, он не умеет работать с памятью. Решается на уровне языка управления заданиями (JCL). В МQL его не может не быть, но ...