Предполагая, что ваша цель состоит в том, чтобы иметь возможность перезапустить сервер без переобучения, похоже, что ваш лучший вариант (до тех пор, пока в трусиках не будет реализовано травление) - это выбрать data
, eq_string
и любые параметры, рассчитанные по train_model
. Затем при перезапуске сервера вы можете отменить выбор data
и eq_string
и снова вызвать dmats = patsy.dmatrices(eq_string,data)
. Это должно выполняться довольно быстро, так как на самом деле это не тренировка модели, а просто предварительная обработка данных. Затем вы также выберете параметры, рассчитанные по train_model
(не показано в вопросе), и сервер должен быть готов делать прогнозы для новых входных данных.
Обратите внимание, что если вы разбиваете это на клиентские и серверные компоненты, сервер должен делать все, что обсуждалось выше, и клиент должен просто отправить ему input_data
, определенный в вашем вопросе. (Клиенту никогда не нужно видеть dmats
или design_info
.)
Вам придется либо отказаться от примитивного типа, либо использовать произвольное значение int в качестве «недопустимого года».
Отрицательное значение на самом деле является хорошим выбором, поскольку его мало вероятность наличия действительного года, который вызовет переполнение целого числа, и нет действительного отрицательного года.
Возможно, вы захотите использовать здесь класс Integer. Накладные расходы, связанные с объектом, скорее всего (хотя и не обязательно) тривиальны для общей скорости отклика и производительности ваших приложений.
Десятки тысяч экземпляров Integer - это не много. Лучше потратить несколько сотен килобайт, чем проводить оптимизацию раньше времени. Это небольшая цена за правильность.
Остерегайтесь использования контрольных значений, таких как null
или 0
. По сути, это означает ложь, поскольку 0
- это не год, а null
не является целым числом. Распространенный источник ошибок, особенно если вы в какой-то момент не единственный сопровождающий программное обеспечение.
Рассмотрите возможность использования типобезопасного нуля, такого как Option
, иногда известного как Возможно
. Популярный в таких языках, как Scala и Haskell, он похож на контейнер с одним или нулевым элементом. Ваше поле будет иметь тип Option
, который объявляет необязательный характер вашего поля года системе типов и заставляет другой код работать с, возможно, отсутствующими годами.
Вот библиотека, которая включает тип Option.
Вот как вы бы вызывали свой код, если бы вы использовали it:
partyLikeIts.setDocumentYear(Option.some(1999));
Option<Integer> y = doc.getDocumentYear();
if (y.isSome())
// This doc has a year
else
// This doc has no year
for (Integer year: y) {
// This code only executed if the document has a year.
}
Другой вариант - иметь связанный логический
флаг, который указывает, действительно ли ваше значение года. Если этот флаг ложный
, это означает, что год «неизвестен». Это означает, что вам нужно проверить один примитив (логическое значение), чтобы узнать, есть ли у вас значение, а если да, то проверить другой примитив (целое число).
Значения Sentinel часто приводят к нестабильному коду, поэтому стоит приложить усилия, чтобы избежать значение дозорного, если вы не уверены, что это никогда не будет вариантом использования.
Вы можете использовать обычный int, но используйте такое значение, как Integer. MAX_VALUE
или Integer.MIN_VALUE
, которые определены константами как ваша недопустимая дата. Также более очевидно, что -1 или низкое отрицательное значение недействительно, это определенно не будет выглядеть как четырехзначная дата, которую мы привыкли видеть.
Если у вас есть целое число и вы обеспокоены тем, что произвольное значение null может быть перепутано с реальным значением, вы можете использовать вместо него long. Это более эффективно, чем использование целого числа, и Long.MIN_VALUE не находится рядом с любым допустимым значением int.
Что не так с java.lang.Integer? Это разумное решение, если только вы не храните очень большие количества этого значения.
Если вы хотите использовать примитивы, значение -1 также будет хорошим решением. Единственный другой вариант, который у вас есть, - это использовать отдельный логический флаг, как кто-то уже предлагал. Выбери свой яд :)
PS: черт тебя побери, я пытался уйти с небольшой белой ложью о объектах и структурах. Я хотел сказать, что он использует больше памяти, аналогично методу логического флага, хотя синтаксически тип, допускающий значение NULL, конечно, лучше. Кроме того, я не был уверен, что кто-то с опытом работы с Java поймет, что я имел в виду с struct .
java.lang.Integer является разумным для этого случая. В нем уже реализован Serializable, так что вы можете сохранить на HDD только поле year и загрузить его обратно.