2009-08-24 5 views
3

Ich bin ein .NET-Programmierer und entwickle ein System, das Produktionsdaten in Echtzeit sammelt und in einer Oracle-Datenbank speichert. Die Daten müssen einer umfangreichen Verarbeitung unterzogen werden: im Wesentlichen digitaler Signalverarbeitung - Suche nach Minuten und Maxima verschiedener Felder in einem Datenstrom und entsprechende Kategorisierung von Zeitabschnitten. Anscheinend sind es Dinge, die wir (wenn auch nicht unbedingt) mit MatLab-Bibliotheken verarbeiten könnten.Der beste Platz für Datenverarbeitungslogik mit .NET/Oracle-Architektur

Was muss ich wissen, wo die Verarbeitungslogik zu finden ist: innerhalb der Oracle db, implementiert mit PL-SQL (oder was auch immer), oder in einer externen .NET-Programmdatei oder Dienst, der MatLab-Bibliotheken aufrufen könnte?

Eine verwandte Frage: ist es möglich, die Funktionen der MatLab-Bibliothek innerhalb von Oracle aufzurufen? Dies kann die beste Antwort liefern.

Entschuldigung für den Textblock. Jede Hilfe würde sehr geschätzt werden.

Antwort

3

Im Idealfall würden Sie beide benchmarken und sehen, welche Art von Leistung Sie von beiden Optionen erhalten könnten.

Persönlich würde meine Voreingenommenheit sein, dass Datenverarbeitung in der Datenbank geschieht, es sei denn, es gibt einen zwingenden Grund, es woanders zu machen - Datenbanken sind so konzipiert, dass große Datenmengen schnell verarbeitet werden können. In Ihrem Fall gibt es jedoch einen zwingenden Grund, dies anderswo zu tun, da MatLab möglicherweise über bessere Bibliotheken für die digitale Signalverarbeitung verfügt. Wenn Sie nur nach Minimal- und Maximalwerten suchen, ist es wahrscheinlich unwahrscheinlich, dass MatLab effizienter ist als Oracle, sicherlich nicht genug, um die Kosten für die Übertragung einer Reihe von Daten aus der Datenbank zur Verarbeitung und die anschließende Verschiebung der Ergebnisse zu bewältigen Wenn Sie eine komplexere Verarbeitung durchführen - wenn Sie schnelle Fourier-Transformationen (FFTs) usw. durchführen müssen, sind Sie wahrscheinlich besser in der Lage, die bereitgestellten Bibliotheken in MatLab zu verwenden, anstatt FFT-Logik in PL/SQL zu erstellen.

Wenn Ihre Oracle-Datenbank auf einem Betriebssystem läuft, auf dem auch MatLab ausgeführt wird, und MatLab kann eine API im C-DLL-Stil für seine APIs verfügbar machen (wenn nicht, können Sie sicher eine dünne .Net-Schicht einfügen) oben auf MatLab, um eine C-DLL zu erstellen), dann können Sie MatLab-Funktionen als externe Prozeduren von Oracle aufrufen.

+0

gute Antwort im Allgemeinen und +1 für die Erwähnung von Oracle extprocs, eine weniger bekannte Funktion – dpbradley

+0

Danke für die Antwort! Zwischen dieser Antwort und der untenstehenden ist es ziemlich klar, dass - wie bei den meisten Dingen - die beste Route sehr von den Einzelheiten abhängt, was wir erreichen wollen. Wir sind nicht an MatLab gebunden, aber ich hatte gehofft, dass die vorgefertigten Funktionen für das Zahlen-Crunching etwas Zeit sparen könnten. Es kann sich herausstellen, dass wir nicht einmal auf die Funktionen als extprocs zugreifen können, also kann es PL-SQL sein. – Klay

+0

Wenn Sie sich selbst erschrecken möchten, gewann Alberto Dell'Era die NOCOUG SQL-Herausforderung mit einer Lösung, die FFT mit der MODEL-Klausel implementiert :: http://www.adellera.it/investigations/nocoug_challenge/index.html – APC

0

Wir haben ein sehr ähnliches System. Wir sammeln Daten aus Fertigungs-/Analysegeräten, verarbeiten die Rohdaten mit unseren Algorithmen und speichern die Ergebnisse unserer Verarbeitung in einem Standardformat in unserer Oracle-Datenbank.

Wenn Sie Matlab für Ihre Verarbeitung verwenden, klingt es, als ob Sie noch mathematisch intensiver sind als wir, und dennoch haben wir uns entschieden, die gesamte Datenverarbeitung in unseren externen Apps zu verwalten. Unser Schema sieht im Grunde so etwas wie folgt aus:

CREATE TABLE RawData 
    (
    RawDataId   NUMBER(22) DEFAULT Null NOT NULL, (PK) 
    RawDataType   VARCHAR2(50) DEFAULT Null NOT NULL, 
    ExposureToolId  NUMBER(22) DEFAULT Null NULL, 
    EventTime   DATE DEFAULT Null NULL, 
    ... (various columns descibing event characteristics) ... 
    Body     LOB DEFAULT Null NOT NULL, 
    Length    NUMBER DEFAULT 0 NULL 
) 

CREATE TABLE Analysis 
    (
    AnalysisId  NUMBER(22) DEFAULT Null NOT NULL, (PK) 
    RawDataId  NUMBER(22) DEFAULT Null NOT NULL, 
    AnalysisName  VARCHAR2(255) DEFAULT Null NOT NULL, 
    AnalysisType  VARCHAR2(255) DEFAULT Null NOT NULL, 
    AnalyzeTime  DATE DEFAULT Null NULL, 
    Status   CHAR(1) DEFAULT Null NULL, 
    SentToServerDate DATE DEFAULT Null NULL, 
    ServerId   NUMBER(22) DEFAULT Null NULL 
) 

CREATE TABLE DataSet 
    (
    DataSetId  NUMBER(22) DEFAULT Null NOT NULL, (PK) 
    AnalysisId  NUMBER(22) DEFAULT Null NOT NULL, 
    DataSetName  DATE DEFAULT sysdate NULL 
) 

CREATE TABLE Coefficient 
    (
    DataSetId   NUMBER(22) DEFAULT Null NOT NULL, (PK) 
    IdentifierId   NUMBER(22) DEFAULT Null NOT NULL, (PK) 
    Coefficient   FLOAT DEFAULT 0 NULL 
) 

Die gesammelten Daten von den Werkzeugen geht in die RawData Tisch, und zu der Zeit ein Kopfsatz (s) in der Analyse-Tabelle erstellt, die anzeigt, dass die Datenverarbeitung benötigt, zeigt den Namen der Analyse und den Server an, der die Verarbeitung durchführt; Der Status ist auf "Ausstehend" eingestellt. Der Server erhält dann die Nachricht, um die Arbeit auszuführen, und wenn er die Ergebnisse speichert (in der Koeffiziententabelle nach Datasets gruppiert), wird der Status auf "Fertig" gesetzt (oder "Fehler", wenn ein Problem auftrat). Wenn die Serverkomponenten gestartet werden, fragen sie die Analysetabelle nach ausstehenden Aufgaben ab. Auf diese Weise stellen wir sicher, dass bei Abstürzen keine Arbeit verloren geht.

Dies ist seit über zehn Jahren unser Modell, und es funktioniert wirklich gut.Es ist einfach, verschiedene Versionen der Servermodule bereitzustellen und zu verwalten. Meiner Meinung nach ist es einfacher, ausführbare Dateien auf diese Weise zu verwalten, als Pakete auf dem Oracle-Server zu kompilieren, aber das könnte nur mein Vorurteil sein - die Konvertierung von rohen zu analysierten Daten scheint eher "app-zentriert" als eine Datenbankaufgabe.

+0

Dies ist die vorgeschlagene grundlegende Architektur, die wir auch haben. Daten werden von Sensoren generiert, über den Webservice an eine Rohdatentabelle gesendet und anschließend verarbeitet, um Daten zu bereinigen, Spitzen und Ausreißer zu entfernen, die Zeitachse in einzelne Phasen zu zerlegen und Daten in Produktionstabellen umzuschreiben. Ein Teil des Problems besteht darin, dass wir noch nicht genau herausgefunden haben, wie das Aufräumen und die Verarbeitung durchgeführt werden. Als App-Programmierer teile ich Ihre Voreingenommenheit, aber ich versuche objektiv zu sein und nach der besten Lösung zu suchen. Danke für Ihre Hilfe! – Klay

Verwandte Themen