使用.NET / Oracle体系结构的数据处理逻辑的最佳位置

时间:2009-08-24 14:53:06

标签: .net oracle matlab

我是一名.NET程序员,我正在开发一个收集实时生产数据并将其存储在Oracle数据库中的系统。数据需要经过大量处理:基本上是数字信号处理 - 寻找数据流中各个字段的分钟和最大值,并相应地对“时间块”进行分类。显然,我们可以想象(虽然不一定)使用MatLab库进行处理。

我需要知道的是在哪里找到处理逻辑:在Oracle数据库内部,用PL-SQL(或任何适当的)实现,或者在可以调用MatLab库的外部.NET可执行文件或服务中?

一个相关的问题:是否可以在Oracle中调用MatLab库函数?这可能提供最简洁的答案。

对不起文本块。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

理想情况下,您可以对两者进行基准测试,并了解您可以从两个选项中获得哪种性能。

就个人而言,我的偏见是数据处理发生在数据库中,除非有令人信服的理由在其他地方进行 - 数据库旨在快速处理大块数据。但是,您的情况可能有其他令人信服的理由在其他地方进行,因为MatLab可能拥有优质的数字信号处理库。如果你只是在寻找最小值和最大值,那么MatLab可能不太可能比Oracle更高效,当然不足以克服将大量数据从数据库中移出以进行处理然后将结果移回去的费用。如果你正在进行更复杂的处理 - 如果你需要进行快速傅里叶变换(FFT)等 - 你可能会更好地使用MatLab中提供的库而不是尝试在PL / SQL中构建FFT逻辑。

如果您的Oracle数据库在MatLab也将运行的操作系统上运行,并且MatLab可以为其API公开一个C DLL样式的API(如果没有,我相信你可以在上面放置一个瘦的.Net层MatLab创建一个C DLL),然后您可以将MatLab函数作为Oracle的外部过程调用。

答案 1 :(得分:0)

我们有一个非常相似的系统。我们从制造/分析设备收集数据,使用我们的算法处理原始数据,并将我们的处理结果以标准格式存储在Oracle数据库中。

如果你使用Matlab进行处理,听起来你比我们更加数学密集,但我们仍然选择管理外部应用程序中的所有数据处理。我们的架构基本上看起来像这样:

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
  )

来自工具的收集数据进入RawData表,并且在Analysis表中创建标题记录时,表明数据需要处理,显示分析的名称和将要执行的服务器处理;状态设置为“待定”。然后向服务器发送消息以执行工作,并在存储结果时(在Coefficient表中,按数据集分组),状态设置为“Done”(如果遇到问题则为“Error”)。当服务器组件启动时,它们会在Analysis表中查询任何待处理的工作;通过这种方式,我们确保在发生崩溃时不会丢失工作。

这已经是我们十多年来的模式,而且效果非常好。部署和维护不同版本的服务器模块很容易;在我看来,以这种方式管理可执行文件比在Oracle服务器上编译软件包更容易,但这可能只是我的偏见 - 原始数据转换为分析数据似乎比数据库任务更“以应用程序为中心”。