Scenario: Add memory clean for Pamhyr list, dict and reaches.

disable_edition_parent_scenario
Pierre-Antoine 2026-05-21 11:16:31 +02:00
parent 2c0b155baf
commit f9d83ac68c
6 changed files with 65 additions and 7 deletions

View File

@ -103,6 +103,9 @@ class Reach(SQLSubModel):
predicate=lambda obj, data: True,
modifier=lambda obj, data: None,
data={}):
if predicate(self, data):
modifier(self, data)
for p in self._profiles:
p._data_traversal(predicate, modifier, data)

View File

@ -19,7 +19,7 @@
import os
import logging
from tools import logger_exception
from tools import logger_exception, timer, flatten
from Model.Tools.PamhyrDB import SQLSubModel
@ -225,10 +225,13 @@ class Scenario(SQLSubModel):
return aux(self, [])
def drop_deleted_data(self, execute):
@timer
def clean_deleted_data(self, execute):
tables = self.tables_with_deleted_column
branch = self.get_parent_branch()
all_ids = []
for table in tables:
if self.parent is None:
# This scenario is the default scenario, so we can
@ -257,17 +260,23 @@ class Scenario(SQLSubModel):
if ids is None or len(ids) == 0:
continue
ids = flatten(ids)
logger.debug(
f"(s{self.id}) Drop deleted data into '{table}' : {ids}"
f"({self.name}) Drop deleted data into '{table}' : {ids}"
)
execute(
f"DELETE FROM {table} " +
f"WHERE scenario = {self.id} " +
"AND pamhyr_id IN " +
f"({', '.join(map(lambda x: str(x[0]), ids))})"
f"({', '.join(map(str, ids))})"
)
all_ids += ids
return all_ids
@property
def id(self):
return self._id

View File

@ -24,12 +24,15 @@ from datetime import datetime
from tools import timer, timestamp
from functools import reduce
from Model.Tools.PamhyrListExt import PamhyrModelList
from Model.Tools.PamhyrDict import PamhyrModelDict
from Model.Tools.PamhyrDB import SQLModel
from Model.Scenarios import Scenarios
from Model.Scenario import Scenario
from Model.Status import StudyStatus
from Model.Except import NotImplementedMethodeError
from Model.River import River
from Model.Geometry.Reach import Reach
from Checker.Study import *
@ -450,14 +453,48 @@ class Study(SQLModel):
data=progress
)
# Clear DB for each scenarios
for scenar in self.scenarios.lst:
scenar.drop_deleted_data(self.execute)
# Clear DB for current scenario
ids = self.status.scenario.clean_deleted_data(self.execute)
self.memory_clean(ids)
progress()
self.commit()
@timer
def memory_clean(self, ids):
list_classes = set(PamhyrModelList.__subclasses__())
dict_classes = set(PamhyrModelDict.__subclasses__())
reach_class = Reach
def modifier(obj, data):
t = type(obj)
if t in list_classes:
obj._lst = list(
filter(
lambda el: el.id not in ids,
obj._lst
)
)
elif t in dict_classes:
new = {}
for key in obj._dict:
if obj._dict[key].id not in ids:
new[key] = obj._dict[key]
obj._dict = new
elif t is reach_class:
obj._profiles = list(
filter(
lambda el: el.id not in ids,
obj._profiles
)
)
self.river._data_traversal(
lambda o, d: True, modifier, {}
)
def sql_save_request_count(self, *args, **kargs):
return self._count()

View File

@ -97,6 +97,9 @@ class PamhyrModelDict(SQLSubModel):
Nothing
"""
if predicate(self, data):
modifier(self, data)
for key in self._dict:
self._dict[key]\
._data_traversal(predicate, modifier, data)

View File

@ -100,6 +100,9 @@ class PamhyrModelList(SQLSubModel):
Nothing
"""
if predicate(self, data):
modifier(self, data)
for el in self._lst:
el._data_traversal(predicate, modifier, data)

View File

@ -107,6 +107,9 @@ class PamhyrModelList(SQLSubModel):
Returns:
Nothing
"""
if predicate(self, data):
modifier(self, data)
for el in self._lst:
el._data_traversal(predicate, modifier, data)