mirror of https://gitlab.com/pamhyr/pamhyr2
Scenario: Add memory clean for Pamhyr list, dict and reaches.
parent
2c0b155baf
commit
f9d83ac68c
|
|
@ -103,6 +103,9 @@ class Reach(SQLSubModel):
|
||||||
predicate=lambda obj, data: True,
|
predicate=lambda obj, data: True,
|
||||||
modifier=lambda obj, data: None,
|
modifier=lambda obj, data: None,
|
||||||
data={}):
|
data={}):
|
||||||
|
if predicate(self, data):
|
||||||
|
modifier(self, data)
|
||||||
|
|
||||||
for p in self._profiles:
|
for p in self._profiles:
|
||||||
p._data_traversal(predicate, modifier, data)
|
p._data_traversal(predicate, modifier, data)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from tools import logger_exception
|
from tools import logger_exception, timer, flatten
|
||||||
|
|
||||||
from Model.Tools.PamhyrDB import SQLSubModel
|
from Model.Tools.PamhyrDB import SQLSubModel
|
||||||
|
|
||||||
|
|
@ -225,10 +225,13 @@ class Scenario(SQLSubModel):
|
||||||
|
|
||||||
return aux(self, [])
|
return aux(self, [])
|
||||||
|
|
||||||
def drop_deleted_data(self, execute):
|
@timer
|
||||||
|
def clean_deleted_data(self, execute):
|
||||||
tables = self.tables_with_deleted_column
|
tables = self.tables_with_deleted_column
|
||||||
branch = self.get_parent_branch()
|
branch = self.get_parent_branch()
|
||||||
|
|
||||||
|
all_ids = []
|
||||||
|
|
||||||
for table in tables:
|
for table in tables:
|
||||||
if self.parent is None:
|
if self.parent is None:
|
||||||
# This scenario is the default scenario, so we can
|
# This scenario is the default scenario, so we can
|
||||||
|
|
@ -257,17 +260,23 @@ class Scenario(SQLSubModel):
|
||||||
if ids is None or len(ids) == 0:
|
if ids is None or len(ids) == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
ids = flatten(ids)
|
||||||
|
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"(s{self.id}) Drop deleted data into '{table}' : {ids}"
|
f"({self.name}) Drop deleted data into '{table}' : {ids}"
|
||||||
)
|
)
|
||||||
|
|
||||||
execute(
|
execute(
|
||||||
f"DELETE FROM {table} " +
|
f"DELETE FROM {table} " +
|
||||||
f"WHERE scenario = {self.id} " +
|
f"WHERE scenario = {self.id} " +
|
||||||
"AND pamhyr_id IN " +
|
"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
|
@property
|
||||||
def id(self):
|
def id(self):
|
||||||
return self._id
|
return self._id
|
||||||
|
|
|
||||||
|
|
@ -24,12 +24,15 @@ from datetime import datetime
|
||||||
from tools import timer, timestamp
|
from tools import timer, timestamp
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
|
from Model.Tools.PamhyrListExt import PamhyrModelList
|
||||||
|
from Model.Tools.PamhyrDict import PamhyrModelDict
|
||||||
from Model.Tools.PamhyrDB import SQLModel
|
from Model.Tools.PamhyrDB import SQLModel
|
||||||
from Model.Scenarios import Scenarios
|
from Model.Scenarios import Scenarios
|
||||||
from Model.Scenario import Scenario
|
from Model.Scenario import Scenario
|
||||||
from Model.Status import StudyStatus
|
from Model.Status import StudyStatus
|
||||||
from Model.Except import NotImplementedMethodeError
|
from Model.Except import NotImplementedMethodeError
|
||||||
from Model.River import River
|
from Model.River import River
|
||||||
|
from Model.Geometry.Reach import Reach
|
||||||
|
|
||||||
from Checker.Study import *
|
from Checker.Study import *
|
||||||
|
|
||||||
|
|
@ -450,14 +453,48 @@ class Study(SQLModel):
|
||||||
data=progress
|
data=progress
|
||||||
)
|
)
|
||||||
|
|
||||||
# Clear DB for each scenarios
|
# Clear DB for current scenario
|
||||||
for scenar in self.scenarios.lst:
|
ids = self.status.scenario.clean_deleted_data(self.execute)
|
||||||
scenar.drop_deleted_data(self.execute)
|
self.memory_clean(ids)
|
||||||
|
|
||||||
progress()
|
progress()
|
||||||
|
|
||||||
self.commit()
|
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):
|
def sql_save_request_count(self, *args, **kargs):
|
||||||
return self._count()
|
return self._count()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,9 @@ class PamhyrModelDict(SQLSubModel):
|
||||||
Nothing
|
Nothing
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
if predicate(self, data):
|
||||||
|
modifier(self, data)
|
||||||
|
|
||||||
for key in self._dict:
|
for key in self._dict:
|
||||||
self._dict[key]\
|
self._dict[key]\
|
||||||
._data_traversal(predicate, modifier, data)
|
._data_traversal(predicate, modifier, data)
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,9 @@ class PamhyrModelList(SQLSubModel):
|
||||||
Nothing
|
Nothing
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
if predicate(self, data):
|
||||||
|
modifier(self, data)
|
||||||
|
|
||||||
for el in self._lst:
|
for el in self._lst:
|
||||||
el._data_traversal(predicate, modifier, data)
|
el._data_traversal(predicate, modifier, data)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,9 @@ class PamhyrModelList(SQLSubModel):
|
||||||
Returns:
|
Returns:
|
||||||
Nothing
|
Nothing
|
||||||
"""
|
"""
|
||||||
|
if predicate(self, data):
|
||||||
|
modifier(self, data)
|
||||||
|
|
||||||
for el in self._lst:
|
for el in self._lst:
|
||||||
el._data_traversal(predicate, modifier, data)
|
el._data_traversal(predicate, modifier, data)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue