У меня есть потенциальная производительность /узкое место в памяти, когда я пытаюсь рассчитать страховую премию, используя двигатель Drools. efferatant way? (Код из словаря)
[*] ContractCode (код из словаря)
[*] Персональные данные клиента (например, возраст, адрес)
[*] страховая сумма (Si)
[*]. Использование этого формулы :
px фактор параметризуется в файле Excel, а зависит от 2 свойств (возраст клиента и пол)
py strong> in -in five in in in in in in file in in in in file in in in in in piefize на 4 свойства контракта < /li>
pz < /strong> - аналогично < /li>
< /ul>
Требования < /h2>
r1 < /strong> - Java. Формула [/b],
r2 - код Java ничего не знает о зависимости от формулы , другими словами, что премия зависит от: px, py, pz,
r3 - код Java. В возрасте и полу клиента и т. Д. /> У меня есть модель домена контракта < /strong>, которая состоит из контракта классов, продукта, клиента, политики и так далее. Класс контракта определяется как: < /p>
public class Contract {
String code; // contractCode
double sumInsured; // SI
String clientSex; // M, F
int professionCode; // code from dictionary
int policyYear; // 1..5
int clientAge; //
... // etc.
Кроме того, я ввел var класс, который является контейнером для any параметризованная переменная:
public class Var {
public final String name;
public final ContractPremiumRequest request;
private double value; // calculated value
private boolean ready; // true if value is calculated
public Var(String name, ContractPremiumRequest request) {
this.name = name;
this.request = request;
}
...
public void setReady(boolean ready) {
this.ready = ready;
request.check();
}
...
// getters, setters
}
public class ContractPremiumRequest {
public static enum State {
INIT,
IN_PROGRESS,
READY
}
public final Contract contract;
private State state = State.INIT;
// all dependencies (parameterized factors, e.g. px, py, ...)
private Map varMap = new TreeMap();
// calculated response - premium value
private BigDecimal value;
public ContractPremiumRequest(Contract contract) {
this.contract = contract;
}
// true if *all* vars are ready
private boolean _isReady() {
for (Var var : varMap.values()) {
if (!var.isReady()) {
return false;
}
}
return true;
}
// check if should modify state
public void check() {
if (_isReady()) {
setState(State.READY);
}
}
// read number from var with given [name]
public double getVar(String name) {
return varMap.get(name).getValue();
}
// adding uncalculated factor to this request – makes request IN_PROGRESS
public Var addVar(String name) {
Var var = new Var(name, this);
varMap.put(name, var);
setState(State.IN_PROGRESS);
return var;
}
...
// getters, setters
}
Теперь я могу использовать эти классы с таким потоком:
proper excel row fires for each px, py, pz object and makes it ready
Rule2 fires for ContractPremiumRequest[READY] and use formula
тома
Таблица решений PX имеет ~ 100 Rows,
Таблица решений Py имеет ~ 8000 rows,
pz. />
мои результаты < /h2>
Первый расчет, который загружает и инициализирует таблицы решений, требует ~ 45 секунд < /strong> - это может стать проблематичным. < /p>
< /li>
. acceptable for our team.
Heap consumption is ~150 MB – which is problematic as we expect much more big tables will be used.
Question
Я использую Drools неправильным способом? < /li>
Как удовлетворить требования более эффективным образом? ==========
Это короткое резюме через 2 года.
Наша система очень сильно выросла, как мы и ожидали. Мы закончили более 500 таблицами (или матрицами) с страховыми ценами, актуарными коэффициентами, конфигурациями покрытия и т. Д.
Некоторые таблицы имеют размер более 1 миллиона строк. Мы использовали слюни, но мы не могли справиться с проблемами производительности.
Наконец, мы использовали higson Engine (http://higson.io) - прежнее название было гипероном. пересчете на каждом событии Keytype на полях UI. Code.
Application просто продолжает работать с новой логикой, не требуется разработка или перезапуск. src = "https://i.sstatic.net/u43p6.png"/>
У меня есть потенциальная производительность /узкое место в памяти, когда я пытаюсь рассчитать страховую премию, используя двигатель Drools. efferatant way? (Код из словаря) [*] ContractCode (код из словаря) [*] Персональные данные клиента (например, возраст, адрес) [*] страховая сумма (Si) [*]. Использование этого [b] формулы [/b]: [code]premium := SI * px * (1 + py) / pz [/code] где: [list] [b] px [/b] [b] фактор [/b] параметризуется в файле Excel, а [b] зависит [/b] от 2 свойств (возраст клиента и пол) [*] [b] py [/b] strong> in -in five in in in in in in file in in in in file in in in in in piefize на 4 свойства контракта < /li> pz < /strong> - аналогично < /li> < /ul>
Требования < /h2>
r1 < /strong> - Java. Формула [/b], [*] [b] r2 [/b] - код Java ничего не знает о [b] зависимости от формулы [/b], другими словами, что премия зависит от: px, py, pz, [*] [b] r3 [/b] - код Java. В возрасте и полу клиента и т. Д. /> У меня есть модель домена контракта < /strong>, которая состоит из контракта классов, продукта, клиента, политики и так далее. Класс контракта определяется как: < /p> [code]public class Contract {
String code; // contractCode double sumInsured; // SI String clientSex; // M, F int professionCode; // code from dictionary int policyYear; // 1..5 int clientAge; // ... // etc. [/code] Кроме того, я ввел [b] var [/b] класс, который является контейнером для [b] any [/b] параметризованная переменная: [code]public class Var {
public final String name; public final ContractPremiumRequest request;
private double value; // calculated value private boolean ready; // true if value is calculated
... // getters, setters } [/code] и, наконец, - [b] запрос [/b] class: [code]public class ContractPremiumRequest {
public static enum State { INIT, IN_PROGRESS, READY }
public final Contract contract;
private State state = State.INIT;
// all dependencies (parameterized factors, e.g. px, py, ...) private Map varMap = new TreeMap();
// calculated response - premium value private BigDecimal value;
public ContractPremiumRequest(Contract contract) { this.contract = contract; }
// true if *all* vars are ready private boolean _isReady() { for (Var var : varMap.values()) { if (!var.isReady()) { return false; } } return true; }
// check if should modify state public void check() { if (_isReady()) { setState(State.READY); } }
// read number from var with given [name] public double getVar(String name) { return varMap.get(name).getValue(); }
// adding uncalculated factor to this request – makes request IN_PROGRESS public Var addVar(String name) { Var var = new Var(name, this); varMap.put(name, var);
setState(State.IN_PROGRESS); return var; }
... // getters, setters } [/code] [b] Теперь я могу использовать эти классы с таким потоком: [/b] [list] [code]request = new ContractPremiumRequest(contract)< /code>
[code]request.check()[/code] wation == ready если [b] все [/b] var готовы [*] Теперь мы можем использовать формулу, так как запрос имеет все зависимости [/list] Я создал [b] 2 DRL -правила [/b] и подготовленные [b] 3 -й решающие ba. rule1 - contract_premium_prepare.drl: [/b] [code]rule "contract premium request - prepare dependencies" when $req : ContractPremiumRequest (state == ContractPremiumRequest.State.INIT) then insert( $req.addVar("px") ); insert( $req.addVar("py") ); insert( $req.addVar("pz") ); $req.setState(ContractPremiumRequest.State.IN_PROGRESS); end [/code] [b] rule2 - contract_premium_calculate.drl: [/b] [code]rule "contract premium request - calculate premium" when $req : ContractPremiumRequest (state == ContractPremiumRequest.State.READY) then double px = $req.getVar("px"); double py = $req.getVar("py"); double pz = $req.getVar("pz"); double si = $req.contract.getSumInsured();
// use formula to calculate premium double premium = si * px * (1 + py) / pz;
// round to 2 digits $req.setValue(premium); end [/code] [b] Таблица решений px.xls: [/b]
таблица решений. py.xls:
[b] kiecontainer создается один раз на старте: p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> pslious p> p> pless> p> pless> kiecontainer.[code]dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration(); dtconf.setInputType(DecisionTableInputType.XLS); KieServices ks = KieServices.Factory.get(); KieContainer kc = ks.getKieClasspathContainer(); [/code] Теперь для расчета премии для данного договора мы пишем: [/b] [code]ContractPremiumRequest request = new ContractPremiumRequest(contract); // state == INIT kc.newStatelessKieSession("session-rules").execute(request); BigDecimal premium = request.getValue(); [/code] [b] Это то, что происходит: [/b] [list] [*] [b] Правило 1 [/b] для ContractPremiumRequest [init] [*] Это правило создает и добавляет PX и PZ -зависимости (PR и PZ (PR и PZ (PR и PZ (PR и PZ (PZ и PZ (PZ и PZ (PR и PZ (Li> .[code]Var[/code] objects) [*]proper excel row [b]fires[/b] for each px, py, pz object and [b]makes it ready[/b] [*][b]Rule2[/b] fires for ContractPremiumRequest[READY] and use formula [/list]
тома [list] [*] Таблица решений PX имеет [b] ~ 100 [/b] Rows, [*] Таблица решений Py имеет [b] ~ 8000 [/b] rows, [*] pz. /> мои результаты < /h2>
Первый расчет, который загружает и инициализирует таблицы решений, требует [b] ~ 45 секунд < /strong> - это может стать проблематичным. < /p> < /li> . acceptable for our team.
[*]Heap consumption is ~150 MB[/b] – which is problematic as we expect much more big tables will be used.
[/list]
Question
Я использую Drools неправильным способом? < /li> Как удовлетворить требования более эффективным образом? ========== Это короткое резюме через 2 года. Наша система очень сильно выросла, как мы и ожидали. Мы закончили более 500 таблицами (или матрицами) с страховыми ценами, актуарными коэффициентами, конфигурациями покрытия и т. Д. Некоторые таблицы имеют размер более 1 миллиона строк. Мы использовали слюни, но мы не могли справиться с проблемами производительности. Наконец, мы использовали [b] higson [/b] Engine (http://higson.io) - прежнее название было гипероном. пересчете на каждом событии Keytype на полях UI. Code. Application просто продолжает работать с новой логикой, не требуется разработка или перезапуск. src = "https://i.sstatic.net/u43p6.png"/>
Учитывая, что я итерации через несколько списков элементов, которые объединяются, мне нужно создать все возможные результаты, учитывая, что я могу выбрать элемент только из одного списка на каждой итерации.
Пример ввода 1:
a =
b =
Учитывая, что я итерации через несколько списков элементов, которые объединяются, мне нужно создать все возможные результаты, учитывая, что я могу выбрать элемент только из одного списка на каждой итерации.
Пример ввода 1:
a =
b =
Я ищу набор данных с 4 почти линейно разделяемыми классами, чтобы представить различные алгоритмы классификации и сравнить их. Я не хочу, чтобы радужная оболочка, вино, рак Брета, оценка автомобилей, успеваемость студентов .... Я пробовал некоторые,...
Я пытаюсь кодировать процесс принятия решений, который в противном случае требует обширных сценариев, если иначе, и мне интересно, можно ли выразить весь процесс в форме корня, решения и оставить узлы в классификаторе дерева решений Scikit Learn....