Ich habe ein wissenschaftliches Datenverwaltungsproblem, das allgemein erscheint, aber ich kann keine existierende Lösung oder sogar eine Beschreibung davon finden, über die ich lange nachgedacht 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 typischerweise 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), also kann ich sie gegebenenfalls wiederverwenden sowie für die allgemeine wissenschaftliche Integrität.
Meine Bemühungen im Allgemeinen: Ich entwerfe meine Python-Klassen mit dem Problem der Beschreibung. 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 überprüfen, ob zuvor erstellte Datenattribute geeignet sind, indem sie testen, ob ihre Form eine Teilmenge des globalen Parameterstatus 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 dies 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 es von Hand zu machen .
So entdeckt das Programm dynamisch die vollständige Form der Datenattribute, indem es Aufrufe anderer Klassenattribute verfolgt und ihre Form über einen verwalteten Stapel von __get__
-Aufrufen an die Aufrufer zurückschickt. 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 Datenattribute in einer db, so dass ich abfragen kann, ob entsprechende Daten (d. h. ihre Form ist eine Teilmenge des aktuellen Parameterzustands) bereits existieren. 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 sich in sql übersetzen lassen.
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 terminal, da 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 Lösungen. 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 nicht mit den vorherrschenden Winden des Webs übereinstimmt.
Ich habe keine spezifischen Python-bezogenen Vorschläge für Sie, aber hier sind ein paar Gedanken:
Sie haben eine gemeinsame Herausforderung in der Bioinformatik. 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 auch am besten, lose gekoppelte Tools zu verwenden, die eine Sache gut machen, so dass Sie sie schnell für verschiedene Analysen zusammenführen können.
Sie könnten auch erwägen, eine Version dieser Frage an den Bioinformatik-Stapelaustausch in Ссылка
zu übergebenZODB wurde nicht entwickelt, um mit massiven Daten umzugehen, es ist nur für webbasierte Anwendungen gedacht und in jedem Fall ist es eine Flat-File-basierte Datenbank.
Ich empfehle Ihnen PyTables , eine Python-Bibliothek für die Verarbeitung von HDF5-Dateien, ein Format, das in der Astronomie und Physik zum Speichern verwendet wird ergibt sich aus großen Berechnungen und Simulationen. Es kann als eine hierarchisch ähnliche Datenbank verwendet werden und bietet auch eine effiziente Möglichkeit, Python-Objekte zu piktieren. Übrigens erklärte der Autor von pytables, dass ZOdb zu langsam war für das, was er tun musste, und Ich kann dir das bestätigen. Wenn Sie an HDF5 interessiert sind, gibt es auch eine andere Bibliothek, h5py .
Als Tool zur Verwaltung der Versionierung Ihrer verschiedenen Berechnungen können Sie versuchen, sumatra zu testen , die eine Erweiterung von git / trac darstellt, aber für Simulationen konzipiert wurde.
Sie sollten diese Frage auf biostar stellen, dort finden Sie bessere Antworten.
Tags und Links python nosql scientific-computing bioinformatics aop