Я использовал pympler
для анализа тестового примера, на который вы указали.Вот что я нашел:
После pyomo_model_prep
(загружает данные и помещает их в пустые ConcreteModel
):
- использование памяти составляет 13,2 МБ
После добавления всех объектов Set
и Param
:
использование памяти составляет 13,3 МБ
После добавления всех Var
объектов:
использование памяти составляет 14,3 МБ
После добавления всех Constraint
объектов:
использование памяти составляет 15,0 МБ
Когда я устанавливаю временные шаги на 60, результаты равны
- использование памяти составляет 13,2 МБ (данные)
- использование памяти составляет 13,3 МБ (после наборов, параметров)
- использование памяти составляет 19,6 МБ (после переменных)
- использование памяти составляет 23,6 МБ (после ограничений)
Таким образом, переменные оказывают довольно большое влияние на память модели, когда существует большее количество временных шагов.Единственное очевидное место, которое я вижу для сокращения использования памяти, это не хранить все данные в модели (или удалять их из модели после того, как они больше не нужны), тогда, возможно, то, что не используется, будет очищено сборщиком мусора..
К сожалению, на самом деле не существует простого способа уменьшить объем памяти объявлений переменных.
Обновление 1: просто к сведению, почти все использование памяти для объявлений переменныхявляется результатом индексированных переменных e_pro_in
и e_pro_out
.
Обновление 2: Если большое количество индексов переменных e_pro_in
и e_pro_out
не используется в модели, вы можете уменьшитьтребования к памяти путем создания сокращенного набора индексов для каждого из них.Вот как это может выглядеть:
e_pro_in_index = []
for t in m.tm:
for i,j in m.pro_tuples:
for c in m.com:
if ...:
e_pro_in_index.append((t,i,j,c))
m.e_pro_in_index = Set(dimen=4, initialize=e_pro_in_index)
m.e_pro_in = pyomo.Var(
m.e_pro_in_index,
within=pyomo.NonNegativeReals,
doc='Power flow of commodity into process (MW) per timestep')
Вам потребуется извлечь логику из правил ограничения, чтобы выяснить, какие индексы не нужны.