您的位置:首页 > 其它

数据引发的思考、实践

2013-10-25 23:40 459 查看

_由2000W多条开房数据引发的思考、实践----给在校生的一个真实【练耙场】,同学们,来开始一次伟大的尝试吧。

缘起---闲逛博客园

前几天的时候,在某一QQ群看到一条消息“XXX酒店开房XXXBTXX迅雷BT下载”,当时是一目十行的心态浏览,目光掠过时,第一反应时我邪恶了~以为是XX种子(你懂的~),所以并不感兴趣,呵呵.... 直到又回到博客园逛时,看到一篇最多评论的文章:

看看多线程的效率有多差劲! - 张浩华 - 博客园
http://www.cnblogs.com/zhhh/p/3385751.html
于是点击进去了。这时,我才回想起来,当时是自己邪恶想多了...... 原来是2000w条开房数据记录的数据库,浏览了文章后,我表示对这2000w感兴趣了!于是,就催生了此文。

结缘---搜索引擎来牵线

看了上面提到的那文章,我决定也要玩一玩,不过那园友有点儿“懒”了,没有提供数据库以及Demo下载。好吧,这时候我们要发挥搜索本领了,几经搜索,最后是Google帮上的忙(百度搜索到的链接很多都已经被和谐了~)。 (温馨提示:近来上级严查水表,各位传播东西需小心~)。

一个小时过去了,1.7GB的压缩文件终于下载完成:

解压后,约8GB多。

小巫见大巫

面对这千万条数据级别的数据库文件,先来看一看我的本机配置信息:

View Code

可以看得出作者很懒,除了主键id,其它字段一律用 nvarchar,长度4000应付,其实看到这里的时候,我有点怀疑这些数据的真实性(是否随意生成)的。

nvarchar(n)    变长    处理unicode数据类型(所有的字符使用两个字节表示)
n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零


验证数据真实性(希望更多朋友提供准确的方式)

带着疑问出发,我用了这个语句来查询:

select  * from dbo.cdsgus where Address like 'XX省XXx市XX镇XX村%'   --X代表地点名称


呵呵,还真找到了几个熟悉的小伙伴,尚且当它是真的吧。又或者原数据库被人加工、整理过之后,随便建立了一个表保存起来的之后再备份出来放在网上的。

(我就纳闷了,整个备份文件还原之后仅只有一个表~)

说回正题,我们再看看:

Name    Owner     Type          Created_datetime
cdsgus  dbo       user table      


作者是夜猫子,看一看创建日期:2013-05-23 04:02:21.120。

ID自动增涨列:

Identity    Seed    Increment    Not For Replication
id             1        1            0


index_name        index_description                  index_keys
Index_Birthday    nonclustered located on PRIMARY     Birthday
Index_ByAddress    nonclustered located on PRIMARY    Address
Index_ByName    nonclustered located on PRIMARY       Name
PK_cdsgus    clustered, unique, primary key located on PRIMARY    id


原本只有id默认主键索引,Name,Address,Birthday是我后来加上的。

constraint_type        constraint_name    delete_action    update_action    status_enabled
PRIMARY KEY (clustered)    PK_cdsgus    (n/a)    (n/a)    (n/a)    (n/a)    id


ok!表字段结构我们看完了,尽管这这个数据库只有一个表,表中只设置了一个id主键。但从结果显示中,

我们可以看出,其实有几个字段是作外键使用的,

如下图中的:District1--6,family,id等。



既然了了外键,那么应该还有其它的数据表,希望哪位可以提供上来,呵呵。

天马行空---数据挖掘、分析、利用

数据有了,除了用来练习几个select 语句还能有什么用呢?

这个时候,该发挥我们的天马行空思想了,看一看,想一想里面都有什么了?

由于里面的数据有其真实性,且有了身份证号码,邮箱地址,手机号码......嘿嘿,想到了吧?不要用来做坏事哦!

骗子们得到数据后,可能会用来群发敲诈短信;

广告诉们可能会用来传广告;

数据挖掘专家可能会用来了解各地入口入住人数,年龄阶段,分布时间范围等。

......

我们也来学着分析一下,(在园子里的应该都接触过sql语句,下面直接取样分析)

地区分布:(以北,上,广为例)

select  count(*) as '北京' from dbo.cdsgus where Address like '北京%'
select  count(*) as '上海' from dbo.cdsgus where Address like '上海%'
select  count(*) as '广东' from dbo.cdsgus where Address like '广东%'




结论:留给大家思考......

年龄分布:

select  count(*) as '00后' from dbo.cdsgus where Birthday like '20%'
select  count(*) as '1990后' from dbo.cdsgus where Birthday like '199%'
select  count(*) as '1980后' from dbo.cdsgus where Birthday like '198%'
select  count(*) as '1970后' from dbo.cdsgus where Birthday like '197%'
select  count(*) as '1960后' from dbo.cdsgus where Birthday like '196%'
select  count(*) as '1950后' from dbo.cdsgus where Birthday like '195%'
select  count(*) as '1940后' from dbo.cdsgus where Birthday like '194%'
select  count(*) as '1930后' from dbo.cdsgus where Birthday like '193%'
select  count(*) as '1920后' from dbo.cdsgus where Birthday like '192%'
select  count(*) as '1910后' from dbo.cdsgus where Birthday like '191%'
select  count(*) as '1900后' from dbo.cdsgus where Birthday like '190%'
select  count(*) as '1800后' from dbo.cdsgus where Birthday like '180%'


结果:80后作为主力军,你是否在其中呢?



类似的模糊查询,大家可以灵活变通,如查询客户是移动的用户还是联通的多(根据手机号码前N位),邮箱后缀名等。

建议

查询示例到此告一段落,现在网上也有不少人把这数据库作为数据源,可以通过Web页面进行查询了,

但我用了几个都很不理想,速度慢得可怜,有时候真怀疑他有没有建立相应的索引了,最大的局限性是:仅能通过身份证,姓名去查。

对于作为程序员的你,你接受这样的低权限吗?

所以,建议大家有空还是应该找到这文件,在本地测试,推荐给所有在校生,可以用来练习一下多数据查询,优化问题。

当然,如果哪位朋友有资源的话,建立一个Web页面,可以直接输入sql命令来查询的那就更好了。

最后来一张关于数据价值转化的图:



我们现在得到数据库了,直接到达了加工车间这一层,至于怎样去发掘,那就要看你们的创意了。

总结

自从在学校交了210元的费用考了个所谓的的数据库工程师资格证(学校要求必须要考,但没什么技术含量),

之后比较少接触SqlServer数据库了,转眼,10月底了,再过一段时间就要准备实习了,目前还是在校生。

这次藉由这个2000w来温习了一下相关的基础知识,

磁盘IO性能问题,数据备份,恢复,索引,模糊查询,函数调用,大数据分析,挖掘,利用等。

抛砖引玉---期待亮点评论

此文,仅仅代表一个在校生初试2000w条记录的数据库的浅显实践,泛泛而谈,个中的结论,推断难免轻浮、果断。

不足之处,还望各位资深读者多多指导,斧正本文的错误论点。

libcef 学习资源

libcef是直接基于chromium的content api开发的嵌入式框架,便于将chromium集成到自己的应用程序里。

初步学习libcef会有框架负担成本的,首先要先大致理解下chromium本身的构架设计,基本概念和模型,其次要学习cef本身的框架和概念,接着通过测试libcef的demo达到对cef类间组织关系的理解。依次给出这几个步骤需要的资源和链接:

1、chromium框架设计,基本上需要把chromium设计文档页面上的每个连接都过1-2遍。
设计文档主要包括:多进程构架、进程间通信、多线程模型、chromium分层构架,UI构架。 http://www.chromium.org/developers/design-documents/
2、看完英文的也可以适当看下中文的各种翻译版:
-「chromium源码剖析」,这个链接应该是原创的,上面的图都裂了: http://www.cnblogs.com/duguguiyu/archive/2008/10/02/1303095.html
-「chromium源码剖析」的pdf档: http://ishare.iask.sina.com.cn/download/explain.php?fileid=61635648
-「理解WebKit和Chromium」,图灵社区的电子书,基本上只是翻译之作: http://www.ituring.com.cn/minibook/705
其实重点理解的也就是多进程构架、进程间通信、多线程模型、分层构架、UI构架等。

3、理解了chromium之后,就可以开始接触libcef项目,首先是libcef项目本身的自我介绍: https://code.google.com/p/chromiumembedded/ 这个页面除了简要介绍libcef项目的定位外,还有libcef的.NET、Delphi、Java、Python移植项目的链接,感兴趣的也看之。

4、当然,接着你需要看libcef的项目文档,最主要的是这个: https://code.google.com/p/chromiumembedded/wiki/GeneralUsage 基本上,最重要的也是理解libcef的多进程、多线程、启动流程、最重要的几个类等。
光看文档是不够的,需要通过阅读和修改demo项目来反馈理解,下载binary包: http://www.magpcss.net/cef_downloads/ 通过cefclient项目来初步理解libcef的用法,重点理解CefApp、CefClient、CefBrowser、CefFrame以及各种Handler之间的关系。

5、通过上述折腾,你应该对libcef有个大概的了解,不过对整体框架还是模模糊糊的状态,没关系,继续折腾。

- 「基于.net开发chrome核心浏览器系列」如果你对.NET比较熟悉的话,可以通过这几个链接上的libcef的.NET封装的使用来加深对cef的理解: http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html
- 「Chromium之cef3的.net封装」,其实内容都差不多,只是为了通过重复看demo理解cef的套路。 http://www.cnblogs.com/Sham-poo7/archive/2013/02/12/2910199.html
6、在上述过程之后,你应该大致理解了libcef的几个主要的类用法以及之间的关系。但你可能需要对libcef的各种类有更清晰的了解,这个时候直接去看libcef源码目录下的include文件夹,这里面的所有.h文件都有对类和方法给出详细的注释,这是最佳文档,建议通读。

7、忘记告诉你了,libcef有个自己的论坛。
论坛上很重要的一个页面是FAQ页面,这个应该也是必读的: http://magpcss.org/ceforum/viewtopic.php?f=6&t=10567
这个子版块是libcef的讨论版: http://magpcss.org/ceforum/viewforum.php?f=10
接下去可以去深入libcef的源码,了解libcef的内部机制,不过再继续下去可能需要对chromium本身的源码有一定的理解,如果打算长期跟踪的话,可以继续下去,并且吃掉libcef之后接着去搞更大的chromium这个怪物。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: