Сериализация .rdata файл в базе данных
Вопрос
Я работаю над проектом, в котором у меня много аналитиков, создающих статистические модели в R., они обычно предоставляют мне модельные объекты (файлы .rdata), и я автоматизирую, выполняющую их для различных наборов данных.
Моя проблема в том,
Могу ли я использовать базу данных и сохранить эти файлы .rdata там? Любые намеки на это делать? (В настоящее время я храним файлы .rdata на диск и используете базу данных для хранения информации о местоположении)
Я получаю много сценариев R других аналитиков, которые сделали некоторую предварительную обработку данных, прежде чем они создают модели. У кого-нибудь есть опыт использования PMML, чтобы сделать этот процесс повторять без ручного вмешательства? PMML хранит шаги предварительной обработки, моделирующие шаги как метки Markup, и повторят одинаковую на основе нового набора данных.
Спасибо за предложения и отзывы.
-Жесткий
Решение
Да, это возможно, например, MySQL, связанный с r с RMySQL
а также DBI
пакет или через RODBC
или RJDBC
упаковка. Я не на 100% уверен, что если бы они все поддерживают BLOBS, но в худшем случае вы можете использовать представление ASCII и поместить их в текстовое поле.
Трюк использует функцию serialize()
> x <- rnorm(100)
> y <- 5*x+4+rnorm(100,0,0.3)
> tt <- lm(y~x)
> obj <- serialize(tt,NULL,ascii=T)
Теперь вы можете хранить или получить OBJ в базе данных. Это на самом деле не более чем вектор ASCII (или двоичных) кодов. ASCII = F дает ваше двоичное представление. После извлечения его, вы используете:
> unserialize(obj)
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
4.033 4.992
Редактировать: относительно PMML, есть pmml
пакет на кран. Может быть, что кто-то дает тебе где-то?
Другие советы
Г может сериализовать и десериализировать Любые объект, вот как мой переварить Пакет создает так называемые «хэш-накопители», запустив хеш-функцию над сериализованным объектом.
Так как только у вас есть сериализованный объект (который может быть сериализован character
), Храните его. Любая реляционная база данных будет поддерживать это, так как будет ли в качестве ключа / значений / значений NoSQL - и для любого бэкэнда, которую вы даже можете использовать «хэш-перевадку» в качестве ключа, либо какую-то другую мета-информацию.
Другие альтернативы, например, Rprotobuf. которые также могут также сделать сериализовать и десериализовать очень эффективно (но вам придется сначала написать файлы .proto).
Обратите внимание, что файл .rdata может содержать множество объектов R, поэтому вам нужно решить, как иметь дело с этим. Если вы прикрепите файл .rdata, вы можете получить объекты в нем с помощью LS () с аргументом POS:
> attach("three.RData")
> ls(pos=2)
[1] "x" "y" "z"
Затем вы можете зацикливаться на них, получить () их по имени из позиции, и сериализуйте их в список (P - мой индекс списка)
> s=list()
> p=1
> for(obn in obnames){
+ s[[p]] = serialize(get(obn,pos=2),NULL,ascii=TRUE)
+ p=p+1
+ }
Теперь вам придется вскипить элементы S к вашей БД, вероятно, в таблице имени (какой-то картин) и значение (сериализованные данные, BLOB или Varchar, я думаю).
Как упомянули другие, да, вы можете хранить выходы из моделей в виде текста в вашей базе данных. Я не убежден, что это будет очень полезно для вас, хотя.
Если вы хотите иметь возможность воссоздать эти модели с более поздней датой, вам необходимо хранить входной набор данных и код, который создал модели, а не вывод.
Конечно, вы могли бы сохранить вывод модели, и в этом случае вам нужно подумать о своем формате в базе данных. Если вы хотите иметь возможность найти определенные результаты модели и фильтровать или заказывать их, то будет намного проще, если вы добавите их в базу данных с какой-то структурой (и некоторыми метаданными).
Например, вы можете захотеть извлечь все модели, где был значительный гендерный ответ. В этом случае вам необходимо добавить эту информацию как отдельное поле в базе данных, а не на необходимость поиска по кускам ASCII. Добавление другой информации, такой как Model Creator и дата создания, также поможет вам позже.