ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

时间:2022-09-19 14:29:34

一. 前言

好久没有更新博客了,最近一直在忙着找工作,目前差不多尘埃落定。特别期待而且准备的都很少能成功,反而是没怎么在意的最终反而能拿到,真是神一样的人生。

言归正传,一直以来,数据挖掘系统的数据类型是我很头疼的问题,不可能为了每一种场景都定义一种新的数据类型,但通用类型又没法满足所有需求,而且性能上有影响。思来想去,最终决定结合两种特点制定一种方案:以通用类型为主,一些特定场合和要求再制定自定义类型,比如微博。   通用数据类型的名字叫FreeDocument,它的内部核心是Dictionary<string,Object>,实现了一组接口,提供了默认转换和读写等功能。

以通用类型为核心,一切问题变得简单了,一切都因为这个伟大的接口:IDictionarySerializable。所有可存取的数据都实现了该接口。具体介绍请看博文: 推荐一个简单好用的接口——字典序列化

本节将介绍几个特性:数据库连接的改进,虚拟化技术与强化的脚本系统。

我的插件式桌面软件框架类库(一)XFrmWork简介

ITTC数据挖掘平台介绍(综述)——平台简介

ITTC数据挖掘平台介绍(二) 微博数据挖掘和分析

ITTC数据挖掘平台介绍(三) 微博社团和传播分析

ITTC数据挖掘平台介绍(四) 框架改进和新功能

ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成

ITTC数据挖掘系统(六)批量任务,数据查看器和*文档

ITTC数据挖掘平台介绍(七)强化的数据库,虚拟化,脚本编辑器

二. 数据库系统

做软件的人大致都有我这样的想法:支持所有的数据库。可是,真正情况并非如此,关系型数据库有它们各自的数据库方言,非关系型数据库则更是千差万别,数据模型都不一样了。ORM框架早已无法满足这类需求,因此,我决定自己做数据库接口层。

字典序列化接口定义了每种数据与字典(键值对)互相转换的逻辑。因此,它天生就适应于文档数据库(如MongoDB)和其他各类键值数据库,对于关系型数据库的脑残的Object[]数组,可以让字典的键按照String的排序器排序,就可在Object[]数组与实例对象之间相互转换了。

我定义了如下的数据库接口:

/// <summary>
/// 基本数据库管理接口
/// </summary>
[Interface("IDataBaseConnector", "数据库连接器接口", SearchStrategy.FolderSearch)]
public interface IDataBaseConnector
{
/// <summary>
/// 保存数据到数据库
/// </summary>
/// <param name="source">要保存的数据</param>
/// <param name="dbTableName">表名称</param>
void BatchInsert(IEnumerable<IDictionarySerializable> source, string dbTableName);
/// <summary>
/// 获取当前目录下的表名
/// </summary>
/// <returns></returns>
List<string> GetTableNames(); string Name { get; set; } string ConnectionString { get; set; } //数据库名
string DBName { get; set; } bool ConnectDB(); bool CloseDB();
/// <summary>
/// 获取对应表名的数据
/// </summary>
/// <param name="tableName"></param>
/// <param name="skip">跳过 </param>
/// <param name="mount"> 数量</param>
/// <returns></returns>
List<IDictionarySerializable> GetEntitys(string tableName, Type type, int mount, int skip = ); List<T> GetEntitys<T>(string tableName, int mount, int skip = ) where T : IDictionarySerializable, new();
/// <summary>
/// 创建表
/// </summary>
/// <param name="dataType">数据类型</param>
/// <param name="createStr">创建字符串</param>
void CreateTable(Type dataType, string createStr);
/// <summary>
/// 是否可用
/// <remarks>数据库服务可能处于离线模式</remarks>
/// </summary>
bool IsUseable { get; }
/// <summary>
/// 更新到数据库
/// </summary>
/// <param name="tableName"></param>
/// <param name="updateItem"></param>
void SaveOrUpdateEntity(IDictionarySerializable updateItem, string tableName, string keyName, object keyvalue);
/// <summary>
/// 删除表数据
/// </summary>
/// <param name="tableName"></param>
void DropTable(string tableName); }

接口层中,包括了连接/断开数据库,存储和读取的泛型和非泛型版本,只可惜没有查询。查询的问题等之后再做详细的讨论。

于是,以这个接口为基准,实现了MongoDB连接器和SQL Server连接器。 请看实现的效果:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

你可以通过配置XML文件,来定义多个连接器。该配置文件位于根目录插件的MainConfig.xml,你可以指定每个连接的数据库类型,库名称和连接字符串等。

读取过程: 点击每个连接器,可以获取所有表名,选取不同的表名,可以按照已经选定的数据类型进行转换(默认使用*文档,而使用专用数据类型可获得更好的性能)。点击“添加到数据管理器”,即可将数据添加到数据管理器,供不同算法模块进行处理。

写入过程: 可将数据管理器的不同数据写入到数据库中。将数据管理器的数据拖放到DataGrid视图中,填写”新表表名“,即可将数据保存到数据库中。

若数据库无法连接,则该库的所有操作都无法进行,此时需要点击刷新连接,强制重连。

如此设计之后,系统即可支持各类数据库,并具备灵活配置的特点。

三. 虚拟化技术

由于数据挖掘系统可能会处理数据量非常巨大,以至于无法读取到内存中的数据,因此必须启用虚拟化。所谓虚拟化就是真实的数据并非处于内存,而是在需要的情况才读入内存,当若干个周期之后没有访问,则该数据又会被清理。与缓存的模式非常类似,因此,需要将算法设计为缓存友好:尽可能在同一时间段内读取连续 索引号的数据。

数据管理器如下图:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

当你将一个文档拖入到数据管理器中时,系统会自动检测文件大小和文件类型,选用不同的处理策略。文件小时直接读入内存,文件体积超过100M时,将数据虚拟化。此时,即使是1GB的csv数据表,都可瞬间被导入。在此基础上,DataCollection集合类处理了虚拟化的所有细节,提供了统一的访问器:算法模块依旧可通过InputData[n] ,n是索引的方式查询数据,也可以实现枚举器。底层将实现缓存架构,合理的读取和清理内存。

一个简单的例子便是,2000万的开房数据,瞬间被读入,对其使用LINQ做查询统计,缓存器流式读取数据,并进行流式统计,最终输出结果,整个过程中内存占用量都很低。

诚然,这种虚拟化的性能肯定不如全部加载到内存当中的速度,但这确实不失为一种可能性。  具体的设计方案和设计请参考我的博文:

四.脚本系统

什么东西最灵活?不是任何酷炫的UI,而是平凡到不能再平凡的语言,当然前提是你必须懂怎么用它。所以程序员最喜欢cmd,而普通人则更喜欢UI.

做数据挖掘工具,如果完全脱离脚本,必然是不可行的,否则,你如何定义一条数据有多重要?升级到这一版本,无论如何都需要使用脚本了。当然,我要使得脚本更简洁易用。它应当包含自动提示和保存功能,应当富有足够的表现力。

可是,脚本系统同样面临一大堆挑战。假设一个数据类型Student,它拥有Height,MathScore,EnglishScore等属性。那么,你怎么定义它的权重,关系,分类,以及其他各类莫名其妙的需求?

比如你可以这样写,以权重计算为例:

Score=@(Height)*2+ @(MathScore)*3- @(EnglishScore)+100

@关键字表名了它是一个变量,可以通过IDictionarySerializable接口序列化生成的字典索引器Item[Key]来读取对应的值。当然你可以扩展更复杂的表达式。

因此,”脚本“有这么几个要素:数据类型(决定哪些是可识别的变量),脚本类型(决定返回值的意义),脚本内容(应当是正确无误的),描述(可选)。脚本同样可以保存在XML中,它保存在插件的文件夹中的ScriptLibaray.XML里。

因此,我借鉴了国外著名大神的脚本解析器系统,开发了一套提供变量提示的脚本编辑和使用系统。

你可以点击数据管理器下的脚本编辑器:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

当你希望能自定义”科研项目数据“的权重计算逻辑时,可以在数据源上选取”科研项目“,由于目前系统中还没有存储任何已有的满足科研项目的权重脚本,所以”脚本库“的下拉菜单中是空的。

在”脚本编辑“栏中,即可输入脚本。我们希望权重=项目资金*3+ (结束时间-启动时间)*5

则在变量中,选取:Money:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

在操作符中,选取DateDIFF(它是计算日期之差的函数)。

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

最终得到的脚本如下:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

当你希望保存这条脚本时:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

填写脚本名称和脚本描述,点击”新建脚本“,即可将脚本保存在文件中。当然,不保存也不影响这次使用。

将一个“计算方法A”的测试模块拖放到算法管理器中:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

本模块对脚本的使用非常简单,只是单纯的输出每条数据计算的结果:

foreach (var item in SysDataManager.ScriptExecutor.Execute(this.Script1.SelectItem, CurrentCollection.MyComputeData))
{
XLogSys.Print.Info(item.ToString()); ;
}

即可在对应的“脚本选择”对话框中,得到刚才输入的脚本。如果这条脚本有错:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

在脚本管理器上重新修改之后,即可输出结果:

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

哈哈,完成。不知道各位看官对这样的脚本编辑器是否满意。脚本其实是潘多拉的魔盒,她功能强大,但稍微不小心就会出错,或者不满足要求。因此对她的限制必不可少。计算模块必须给出对脚本类型和数据类型要求,才能检索出满足条件的脚本供用户选择。我作为设计者,还是觉得它实现起来稍微复杂了,用户体验并不友好。可是到底怎样的脚本工具才是好用的呢?我毕竟不能做一个编译器进去,这样的事情确实够头疼。

五.总结

除了以上这些升级之外,系统还增加了多款分类器和机器学习模块。这些升级我们下次专门开一节讨论算法。

最近的一段时间要升级软件的鲁棒性和稳定性,我也要系统的学习统计和SPSS的知识,加油!

ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器的更多相关文章

  1. ITTC数据挖掘平台介绍(五) 数据导入导出向导和报告生成

    一. 前言 经过了一个多月的努力,软件系统又添加了不少新功能.这些功能包括非常实用的数据导入导出,对触摸进行优化的画布和画笔工具,以及对一些智能分析的报告生成模块等.进一步加强了平台系统级的功能. 马 ...

  2. ITTC数据挖掘平台介绍&lpar;四&rpar; 框架改进和新功能

    本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化     如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下:   ...

  3. 【SPMF开源数据挖掘平台入门】MaxSP算法使用说明

    前段时间,由于项目中用到了序列挖掘的算法,师兄推荐我用用SPMF.在此做个记录. 首先简单介绍一下SPMF: SPMF是一个采用Java开发的开源数据挖掘平台. 它提供了51种数据挖掘算法实现,用于: ...

  4. Android平台介绍

    一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操 ...

  5. 大数据和Hadoop平台介绍

    大数据和Hadoop平台介绍 定义 大数据是指其大小和复杂性无法通过现有常用的工具软件,以合理的成本,在可接受的时限内对其进行捕获.管理和处理的数据集.这些困难包括数据的收入.存储.搜索.共享.分析和 ...

  6. cWeb开发框架,基于asp&period;net的cWeb应用开发平台介绍(二)

    cWeb是基于微软的.Net Framework 4框架,数据库是sql server 2008 r2. cWeb开发框架下载,点击这里去下载. cWeb开发框架借鉴三层架构理论分为三层,分别是:cD ...

  7. cWeb开发框架,基于asp&period;net的cWeb应用开发平台介绍(一)

    cWeb开发框架是基于asp.net的B/S应用开发平台,采用三层架构理论,应用简单.代码简洁.运行快速. cWeb是bubufx提供,是分享资源,无任何版权限制,bubufx继续传承互联网精神,可随 ...

  8. PHP&period;2-LAMP平台介绍及网站的工作原理

    LAMP平台介绍及网站的工作原理 1.HTTP协议 URL(UniformResourceLocator)统一资源定位符,就是网页地址的意思.[格式:协议://主机.端口.文件.附加资源] ##URL ...

  9. &lbrack;译&rsqb; AR SDK的种类比你想得要多!这里介绍七个棒棒哒

    作者:Eddie Offermann 原文:There are dozens more Augmented Reality SDKs than you think! Here are seven gr ...

随机推荐

  1. centos 安装 svn

    1: yum 安装 svn yum install  -y subversion 2验证是否安装完成 svnserve –version svnserve, version 1.6.11 (r9344 ...

  2. ExtJs布局之border

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  3. eclipse中建立tomcat容器

    步骤 1.  new - orther - server 出现下图,选择tomcat版本, 2. 选择已有的web项目至tomcat容器中,如果尚未建立,可不选. 3. 点击完成后,就会发现一个新建项 ...

  4. php非阻塞

    PHP非阻塞模式 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_ ...

  5. 彻底解决Yii2中网页刷新时验证码不刷新的问题

    修改vendor/yiisoft/yii2/captcha/CaptchaValidator.php这个文件就可以了,修改的地方见下图: 总结 归根到底,是因为yii2在渲染网页的时候,会先输出js验 ...

  6. Android SDK Manager for Mac 在线更新镜像地址截至2017-10-01亲测有效

    虽然国内google被墙了,但仍可利用国内的某些镜像网站实现Android SDK在线更新,使用方法如下: 1.启动 Android SDK Manager ,打开主界面,依次选择『Tools』.『O ...

  7. 9&period;4 翻译系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-f ...

  8. php5&period;4 trait 理解与学习

    Trait 是 php5.4引入的新特性,手册上说的一大段没看懂,这里直接来过来. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员 ...

  9. eos源码分析和应用&lpar;一&rpar;调试环境搭建

    转载自 http://www.limerence2017.com/2018/09/02/eos1/#more eos基于区块链技术实现的开源引擎,开发人员可以基于该引擎开发DAPP(分布式应用).下面 ...

  10. exchange 升级顺序导致的邮件被发不出的问题?

    最近在做一个项目POC,准备升级过程目前的2007 环境到exchange 2010,由于客户环境是exchange 2007 sp1 不满足升级的基本条件,我们必须将exchange 2007 sp ...