2010-06-19 3 views
8

Ich habe ein wissenschaftliches Datenverwaltungsproblem, das allgemein scheint, aber ich kann eine vorhandene Lösung oder sogar eine Beschreibung davon nicht finden, die ich seit langem verwirrt habe. Ich stehe kurz vor einer großen Neufassung (Python), aber ich dachte, ich würde ein letztes Mal nach existierenden Lösungen suchen, damit ich meine eigenen verschrotten und zurück zur Biologie gehen oder zumindest eine geeignete Sprache für besseres Googlen lernen kann . Das Problem: Ich habe teure (Stunden bis Tage zu berechnen) und große (GB) Datenattribute, die in der Regel als Transformationen von einem oder mehreren anderen Datenattributen erstellt werden. Ich muss genau verfolgen, wie diese Daten aufgebaut sind, damit ich sie als Eingabe für eine andere Transformation verwenden kann, wenn sie zum Problem passt (mit den richtigen Spezifikationswerten aufgebaut) oder neue Daten nach Bedarf erstellt. Obwohl es eigentlich keine Rolle spielt, beginne ich normalerweise mit "etwas wertschöpfenden", etwas heterogenen molekularbiologischen Informationen, zum Beispiel Genomen mit Genen und Proteinen, die von anderen Forschern mit anderen Verfahren kommentiert wurden. Ich muss diese Daten kombinieren und vergleichen, um meine eigenen Schlussfolgerungen zu ziehen. Eine Anzahl von Zwischenschritten ist oft erforderlich, und diese können teuer sein. Zusätzlich können die Endergebnisse die Eingabe für weitere Transformationen sein. All diese Transformationen können auf mehrere Arten durchgeführt werden: Beschränkung auf verschiedene Ausgangsdaten (z. B. Verwendung verschiedener Organismen), Verwendung verschiedener Parameterwerte in denselben Inferenzen oder Verwendung verschiedener Inferenzmodelle usw. Die Analysen ändern sich häufig und bauen auf anderen auf in ungeplanten Wegen. Ich muss wissen, welche Daten ich habe (welche Parameter oder Spezifikationen definieren sie vollständig), beide, damit ich sie gegebenenfalls wiederverwenden kann, sowie für die allgemeine wissenschaftliche Integrität.Python-Lösungen für die Verwaltung von wissenschaftlichen Daten Abhängigkeitsdiagramm von Spezifikationswerten

Meine Bemühungen im Allgemeinen: Ich entwerfe meine Python-Klassen mit dem Problem der Beschreibung im Hinterkopf. Alle Datenattribute, die von einem Klassenobjekt erstellt werden, werden durch einen einzigen Satz von Parameterwerten beschrieben. Ich nenne diese definierenden Parameter oder Spezifikationen die "def_specs", und diese def_specs mit ihren Werten die "Form" der Datenattribute. Der gesamte globale Parameterzustand für den Prozess kann ziemlich groß sein (z. B. einhundert Parameter), aber die Datenattribute, die von irgendeiner Klasse bereitgestellt werden, erfordern nur eine kleine Anzahl von diesen, zumindest direkt. Das Ziel besteht darin, zu prüfen, ob zuvor erstellte Datenattraktionen geeignet sind, indem sie testen, ob ihre Form eine Teilmenge des globalen Parameterzustands ist.

Innerhalb einer Klasse ist es einfach, die benötigten def_specs zu finden, die die Form definieren, indem der Code untersucht wird. Die Reibung entsteht, wenn ein Modul Daten von einem anderen Modul benötigt. Diese Datenattribute haben ihre eigene Form, die vom aufrufenden Objekt möglicherweise als Argumente übergeben, aber häufiger aus dem globalen Parameterstatus herausgefiltert werden. Die aufrufende Klasse sollte um die Form ihrer Abhängigkeiten erweitert werden, um eine vollständige Beschreibung ihrer Datenattribute zu erhalten. Theoretisch könnte das manuell gemacht werden, indem man den Abhängigkeitsgraphen untersucht, aber dieser Graph kann tief gehen, und es gibt viele Module, die ich ständig verändere und hinzufüge, und ... ich bin zu faul und sorglos, um das zu tun Hand.

So entdeckt das Programm dynamisch die vollständige Form der Datenatts, indem es Aufrufe anderer Klassenattribute verfolgt und ihre Form über einen verwalteten Stapel von __get__-Aufrufen an die Aufrufer zurücksendet. Während ich umschreibe, finde ich, dass ich den Attributzugriff auf meine Builder-Klassen streng kontrollieren muss, um zu verhindern, dass beliebige Informationen die Daten beeinflussen. Glücklicherweise macht Python dies mit Deskriptoren leicht.

Ich speichere die Form der Daten Atts in einer Datenbank, so dass ich abfragen kann, ob entsprechende Daten (d. H. Seine Form ist eine Teilmenge des aktuellen Parameterstatus) bereits existiert. In meiner Neufassung verschiebe ich von mysql über die große SQLAlchemy zu einem Objekt db (ZODB oder Couchdb?), Da die Tabelle für jede Klasse geändert werden muss, wenn zusätzliche def_specs entdeckt werden, was ein Schmerz ist, und weil einige der def_specs sind Python-Listen oder dicts, die es schwierig machen, sie in sql zu übersetzen.

Ich glaube nicht, dass diese Datenverwaltung von meinem Datentransformationscode getrennt werden kann, da strenge Attributsteuerung erforderlich ist, obwohl ich versuche, dies so weit wie möglich zu tun. Ich kann vorhandene Klassen verwenden, indem ich sie mit einer Klasse umschließe, die ihre def_specs als Klassenattribute bereitstellt, und db-Verwaltung über Deskriptoren, aber diese Klassen sind insofern terminal, als keine weitere Entdeckung zusätzlicher Abhängigkeitsformen stattfinden kann.

Wenn die Datenverwaltung nicht einfach von der Datenkonstruktion getrennt werden kann, ist es unwahrscheinlich, dass es eine Out-of-the-Box-Lösung gibt, sondern tausend spezifische. Vielleicht gibt es ein anwendbares Muster? Ich würde mich über Hinweise freuen, wie man das Problem sieht oder besser beschreibt. Für mich scheint es ein allgemeines Problem zu sein, obwohl die Verwaltung tiefgründiger Daten möglicherweise im Widerspruch zu den vorherrschenden Winden des Internets steht.

+0

Ihre Beschreibung der Anforderungen für Datenattribute erinnert mich locker an "Bäume!", "Strukturelle Sharing" Folien von http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey von Rich Hickey (Clojure) 0:41:10 – jfs

+0

Danke für den Vorschlag - das sieht so tief aus, dass ich mir etwas Zeit nehmen muss. – ricopan

+0

Ok beobachtete das Gespräch und knackte ein gutes Stück davon in einer allgemeinen Art und Weise. Hätte nie explizit an Zeit gedacht. Ausgehend von meinem spezifischen Problem habe ich gesehen, dass meine Objekte mehr wie Funktionen funktionieren müssen, die unveränderliche Objekte als einzige Möglichkeit bieten, die Datenintegrität mit bekannten "Formen" zu gewährleisten. Hatte nur etwas über Parallelität nachgedacht, aber es verstärkte die Vorstellung, dass meine Klassen im Wesentlichen wie Funktionen handeln mussten und strenge Attributkontrolle hatten. Danke nochmal. Ich muss mich an das Praktische halten, aber das gibt mir ein paar Ideen und Begriffe, die ich verwenden kann, und ein bisschen Glauben. – ricopan

Antwort

2

Ich habe keine bestimmten Python-bezogene Vorschläge für Sie, aber hier sind ein paar Gedanken:

Sie sind in der Bioinformatik eine gemeinsame Herausforderung zu begegnen. Die Daten sind groß, heterogen und in ständig wechselnden Formaten, wenn neue Technologien eingeführt werden. Ich rate Ihnen, Ihre Pipelines nicht zu überdenken, da sie sich wahrscheinlich morgen ändern werden. Wählen Sie ein paar gut definierte Dateiformate und massieren Sie eingehende Daten so oft wie möglich in diese Formate. Meiner Erfahrung nach ist es normalerweise auch am besten, lose gekoppelte Tools zu verwenden, die eine Sache gut machen, so dass Sie sie für verschiedene Analysen schnell miteinander verknüpfen können.

Sie auch eine Version dieser Frage der Übernahme der Bioinformatik stapeln Austausch bei http://biostar.stackexchange.com/

+0

Danke, wird bei Biostar stochern. Dies ist ein anderes Problem als beim Umgang mit den Primärdaten, was beim Analysieren und Prüfen ein Problem sein kann. Primärdaten sind billig (für mich). Es wird teuer, wenn ich es mit mehr Schlüssen schichte - z. B. Proteinfamilien durch eine phylogenetische Inferenz mit immer etwas willkürlichen Parametern zuordnen, diskrete Kookkurrenzprofile erstellen, Genomkontextbeziehungen finden, biologische Prozesse ableiten, mit zellulären Orten kombinieren ... etc all diese Dinge, die benötigt werden, um zu echten Ergebnissen zu gelangen (jede Transformation ist typischerweise eine veröffentlichte Methode) ... Dann ist es teuer. – ricopan

2

ZODB betrachten könnte wurde massiv Daten zu handhaben nicht darauf ausgelegt, ist es nur für webbasierte Anwendungen und in jedem Fall ist es eine Flat-File-basierte Datenbank.

Ich empfehle Ihnen, PyTables, eine Python-Bibliothek zur Handhabung von HDF5-Dateien, die ein Format in der Astronomie und Physik verwendet, um Ergebnisse aus großen Berechnungen und Simulationen zu speichern. Es kann als eine hierarchisch ähnliche Datenbank verwendet werden und bietet auch eine effiziente Möglichkeit, Python-Objekte zu piktieren. Übrigens hat der Autor von pytables erklärt, dass ZOdb was too slow für das, was er tun musste, und ich kann Ihnen das bestätigen. Wenn Sie an HDF5 interessiert sind, gibt es auch eine andere Bibliothek, h5py.

Als ein Tool zur Verwaltung der Versionierung der verschiedenen Berechnungen, die Sie haben, können Sie versuchen, sumatra, die etwas wie eine Erweiterung von git/trac, aber für Simulationen konzipiert ist.

Sie sollten diese Frage auf Biostar stellen, Sie finden dort bessere Antworten.

+0

Danke für die Gedanken. Es ist wirklich die "Form" der Daten (Metadaten, die es definiert), die ich NOsql, nicht die Daten selbst Konstrukte erwägen, obwohl es bequem wäre, sie neben zu speichern. Ich benutze pytables, um meine Daten att gelegentlich zu speichern, mit anständigen Ergebnissen, obwohl sie in der Regel nur aufgestellte numpy Arrays sind. – ricopan

+0

Danke für die heads up über Sumatra. Das sieht nach einem großartigen Werkzeug aus, das ich im Auge behalten werde. Auf den ersten Blick sieht es nicht so aus, als ob es zu meinem Problem passt: Ich möchte nicht alle Daten mit allen Parametern (viele) speichern, sondern nur diejenigen, die sie definieren. Sonst wenn ich eine spätere Analyse mit einem unsinnigen Param verändert, werden relevante Daten nicht als solche angesehen. Das Problem ist also, zu definieren, welche Params die einzelnen Daten dynamisch definieren, womit Sumatra meiner Meinung nach nicht klar kommt. Vielleicht wäre es ein guter Back-End-Speicher für die Metadaten, wenn auch einmal bestimmt, besonders wenn es indexierbar ist. – ricopan

Verwandte Themen