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.
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
Danke für den Vorschlag - das sieht so tief aus, dass ich mir etwas Zeit nehmen muss. – ricopan
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