Решения Python для управления графом зависимостей научных данных по значениям спецификации - PullRequest
8 голосов
/ 19 июня 2010

У меня есть проблема управления научными данными, которая кажется общей, но я не могу найти существующее решение или даже описание, которое я долго ломал голову. Я собираюсь приступить к основному переписыванию (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 в качестве атрибутов класса, и управляет базой данных через дескрипторы, но эти классы являются терминальными в том, что дальнейшее обнаружение дополнительной формы зависимости не может иметь место.

Еслиуправление данными не может быть легко отделено от построения данных, я думаю, маловероятно, что есть готовое решение, кроме тысячи конкретных.Возможно, есть применимый образец?Буду признателен за любые советы о том, как искать или лучше описывать проблему.Мне кажется, это общая проблема, хотя управление глубоко послойными данными, возможно, противоречит преобладающим ветрам в сети.

Ответы [ 2 ]

2 голосов
/ 21 июня 2010

ZODB не был разработан для обработки больших объемов данных, он предназначен только для веб-приложений и в любом случае представляет собой базу данных на основе плоских файлов.

Я рекомендую вам попробовать PyTables , библиотеку python для обработки файлов HDF5, которая используется в астрономии и физике для хранения результатов больших вычислений и моделирования. Он может быть использован как иерархическая база данных, а также имеет эффективный способ выбора объектов Python. Кстати, автор pytables объяснил, что ZOdb был слишком медленным для того, что ему нужно было сделать, и я могу вам это подтвердить. Если вы заинтересованы в HDF5, есть еще одна библиотека, h5py .

В качестве инструмента для управления версиями различных ваших вычислений вы можете попробовать sumatra , который является чем-то вроде расширения для git / trac, но предназначен для моделирования.

Вы должны задать этот вопрос на biostar, там вы найдете лучшие ответы.

2 голосов
/ 20 июня 2010

У меня нет конкретных предложений, связанных с Python, но вот несколько соображений:

Вы столкнулись с общей проблемой в биоинформатике.Данные большие, разнородные и поступают в постоянно меняющихся форматах по мере внедрения новых технологий.Мой совет: не переусердствуйте с вашими конвейерами, так как они могут измениться завтра.Выберите несколько четко определенных форматов файлов и массируйте входящие данные в эти форматы как можно чаще.По моему опыту, обычно лучше иметь слабосвязанные инструменты, которые хорошо справляются с одной задачей, чтобы вы могли быстро объединить их в цепочку для различных анализов.

Возможно, вы также рассмотрите вариант этого вопроса наобмен стека биоинформатики на http://biostar.stackexchange.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...