У меня есть проблема управления научными данными, которая кажется общей, но я не могу найти существующее решение или даже описание, которое я долго ломал голову. Я собираюсь приступить к основному переписыванию (python), но я подумал, что я буду в последний раз использовать существующие решения, чтобы я мог отказаться от своих собственных и вернуться к биологии, или, по крайней мере, выучить некоторый подходящий язык для лучшего поиска в Google. .
Проблема:
У меня есть дорогие (для расчета от нескольких часов до нескольких дней) и большие (ГБ) атрибуты данных, которые обычно создаются как преобразования одного или нескольких других атрибутов данных. Мне нужно точно отслеживать, как создаются эти данные, чтобы я мог использовать их в качестве входных данных для другого преобразования, если оно соответствует задаче (построено с правильными значениями спецификации), или создавать новые данные по мере необходимости. Хотя это не должно иметь значения, я обычно начинаю с «добавленной стоимости», несколько неоднородной информации о молекулярной биологии, например, геномов с генами и белками, аннотированных другими исследователями другими процессами. Мне нужно объединить и сравнить эти данные, чтобы сделать свои собственные выводы. Часто требуется ряд промежуточных шагов, и они могут быть дорогими. Кроме того, конечные результаты могут стать входом для дополнительных преобразований. Все эти преобразования могут быть выполнены несколькими способами: ограничение разными исходными данными (например, использование разных организмов), использование разных значений параметров в одних и тех же выводах или использование разных моделей вывода и т. Д. Анализ часто меняется и основывается на других незапланированными способами. Мне нужно знать, какие данные у меня есть (какие параметры или спецификации полностью их определяют), чтобы я мог использовать их при необходимости, а также для общей научной целостности.
Мои усилия в целом:
Я проектирую свои классы Python, имея в виду проблему описания. Все атрибуты данных, созданные объектом класса, описываются одним набором значений параметров. Я называю эти определяющие параметры или спецификации «def_specs», а эти def_specs с их значениями - «форму» данных. Все глобальное состояние параметра для процесса может быть довольно большим (например, сто параметров), но для данных, предоставляемых любым одним классом, требуется лишь небольшое их количество, по крайней мере, напрямую. Цель состоит в том, чтобы проверить, подходят ли ранее созданные данные, проверяя, является ли их форма подмножеством состояния глобального параметра.
Внутри класса легко найти необходимые def_specs, которые определяют форму, изучив код. Проблема возникает, когда модуль нуждается в данных att от другого модуля. Эти атрибуты данных будут иметь свою собственную форму, возможно, передаваемую вызывающим объектом как аргументы, но чаще фильтруются из состояния глобального параметра. Вызывающий класс должен быть дополнен формой его зависимостей, чтобы поддерживать полное описание своих данных.
Теоретически это можно сделать вручную, изучив граф зависимостей, но этот граф может углубиться, и есть много модулей, которые я постоянно меняю и добавляю, и ... я слишком ленив и неосторожен, чтобы делать это вручную .
Таким образом, программа динамически обнаруживает полную форму атрибутов данных, отслеживая вызовы к другим атрибутам классов и передавая их форму обратно вызывающим (ей) вызовам через управляемый стек вызовов __get__
. Переписывая, я обнаружил, что мне нужно строго контролировать доступ к атрибутам для моих классов построителя, чтобы предотвратить влияние произвольной информации на данные. К счастью, python делает это легко с помощью дескрипторов.
Я сохраняю форму данных atts в дБ, чтобы я мог запросить, существуют ли соответствующие данные (т.е. их форма является подмножеством текущего состояния параметра).В моем переписывании я перехожу из mysql через большой SQLAlchemy к объекту db (ZODB или couchdb?), Так как таблица для каждого класса должна быть изменена, когда обнаружены дополнительные def_specs, что является проблемой, и потому что некоторые из def_specsсписки или дикты Python, которые трудно перевести на sql.
Я не думаю, что это управление данными можно отделить от моего кода преобразования данных из-за необходимости строгого контроля атрибутов, хотя я пытаюсьделай как можно больше.Я могу использовать существующие классы, заключив их в класс, который предоставляет их def_specs в качестве атрибутов класса, и управляет базой данных через дескрипторы, но эти классы являются терминальными в том, что дальнейшее обнаружение дополнительной формы зависимости не может иметь место.
Еслиуправление данными не может быть легко отделено от построения данных, я думаю, маловероятно, что есть готовое решение, кроме тысячи конкретных.Возможно, есть применимый образец?Буду признателен за любые советы о том, как искать или лучше описывать проблему.Мне кажется, это общая проблема, хотя управление глубоко послойными данными, возможно, противоречит преобладающим ветрам в сети.