2000w的数据在网上搞得沸沸扬扬,作为技术宅的我们也来凑凑热闹.
据了解网上有两个版一个是数据库文件另一个是CSV文件的,前者大小有好几个G后者才几百M.对于不是土豪的我们当然下载几百M的.至于在哪下载,请各位发挥吊丝精神GOOGLE一下吧,我们这里只探讨技术,呵呵.
下载后解压的文件如下:

数据被拆分为11个CSV文件,这样我们可以写一个简单的程序对这些文件进行简单的搜索,如搜索姓名,手机号或身份证等.一般我们会采用多线程进行处理,最简单就是每个线程处理一个文件,这个相信大家都会...所以我们这里不讨论多线程,而是多进程.说到多进程处理相对于多线程有什么好处?以下是本人的一些劣见,有什么不妥请指正:

  • 多进程占有独立的内存空间,不用担心数据同步问题
  • 多进程处理时,当一个进程崩掉时不影响别的进程运行
  • 多进程处理能更好的利用系统资源,特别在多核的机子上时
  • 大家补充...

现在我们将采用多进程对有2000w记录的文本文件进行简单的搜索,为什么说是简单搜索,因为我们不追求搜索效率,只要达到搜索目的,并不那么慢就OK了.不知大家对一次关键字搜索5分钟左右能不能接受?不过不接受也没办法,我们这里不研究算法,只介绍多进程处理.
JVMPart是一个开源的Java多进程处理工具,中文应该叫JVM分拆/割吧,不过我觉得叫"双P"更合适,因为里面要实现关键的两个接口——Partitioner和Processor.更多请了解:https://code.google.com/p/jvmpart/
JVMPart使用非常简单,只要实现Partitioner和Processor两个接口.Partitioner的作用就是决定数据怎么分拆,并把分拆出来的参数传给Processor,Processor就是利用Partitioner传过来的参数进行具体的处理.就我们要实现的这个搜索,Partitiner就是读取CSV目录里的文件并把文件路径和关键字传给Processor,Processor就根据文件路径读取文件并利用关键字搜索该文件找到了就显示出来.下面是"双P"的代码实现:

Partitioner:

  1. public class Hotel2000WPartitioner extends SimplePartitioner {
  2. private String keyword = null;
  3. private String dir = null;
  4. private String[] filenames = null;
  5. public Hotel2000WPartitioner(String dir, String keywords) {
  6. this.dir = dir;
  7. this.filenames = findFilenames(new File(dir));
  8. this.keyword = keywords;
  9. }
  10. private static String[] findFilenames(File dir) {
  11. String[] filenames = dir.list(new FilenameFilter() {
  12.  
  13. public boolean accept(File dir, String filename) {
  14. return filename.toUpperCase().endsWith("CSV");
  15. }
  16. });
  17. return filenames;
  18. }
  19. /**
  20. * 决定分为几个进程处理
  21. */
  22. @Override
  23. public int getTotalProcessor() {
  24. return filenames.length;
  25. }
  26. /**
  27. * 把参数传给Processor
  28. */
  29. @Override
  30. public Map<String, Object> processorParams(int index) {
  31. Map<String, Object> params = new HashMap<String, Object>();
  32. params.put("filename", dir+File.separator+filenames[index]);
  33. params.put("keyword", keyword);
  34. return params;
  35. }
  36. }

Processor:

  1. public class Hotel2000WProcessor extends AbsProcessor {
  2. /**
  3. * 读取文件并利用关键字搜索该文件
  4. */
  5. @Override
  6. public void doExecute() throws JvmProcessException {
  7. String keyword = getParams().get("keyword");
  8. String filename = getParams().get("filename");
  9. File f = new File(filename);
  10.  
  11. BufferedReader dr = null;
  12. try {
  13. dr = new BufferedReader(new InputStreamReader(
  14. new FileInputStream(f), "UTF-8"));
  15. while (dr.readLine() != null) {
  16. String line = dr.readLine();
  17. if(line!=null&&line.indexOf(keyword)!=-1) {
  18. System.out.println(line);
  19. }
  20. }
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. } finally {
  24. if(dr!=null)
  25. try {
  26. dr.close();
  27. } catch (IOException e) {
  28. }
  29. }
  30.  
  31. }
  32. }

使用JVMPart工具运行:

  1. public static void main(String[] args) throws JvmProcessException {
  2. String dir = "D:\\我的文档\\下载\\2000W";
  3. String keyword = "土豪";
  4. JvmProcessPatitionHandler handler = null;
  5. // 同时并发三个进程,当其中一个运行完成都踢出另一个运行
  6. handler = new JvmProcessPatitionHandler(Hotel2000WProcessor.class, 3);
  7. Hotel2000WPartitioner partitioner = new Hotel2000WPartitioner(dir, keyword);
  8. System.out.println("搜索中,请稍后...");
  9. long time = System.currentTimeMillis();
  10. handler.handle(partitioner);
  11. System.out.println("花费时间(分):"+((System.currentTimeMillis()-time)/(1000*60)));
  12. }

当程序运行时,我们可以通过任务管理器看到有四个java进程在运行(其中一个为主进程).如图:


至此, 我们对2000w数据的搜索已完成,多进程处理就这么简单.运行截图如下(2000w数据果然厉害,土豪也能找到,哈哈):

下面附件如果你是WIN32的系统不用安装JRE,直接运行即可. WIN64没测试,如不能运行请自行安装64位JRE再运行.
附件使用方式(前提你已下载了CSV版的数据):
1.解压后,把程序Hotel2000W拷到CSV文件所在目录(这一步不做也可以,程序将提示输入CSV目录)
2.双击run.bat
3.按提示输入搜索关键字(姓名,手机或身份证等)
4.等待搜索结果,如果找到将在屏幕中出现

附件:http://pan.baidu.com/s/19qqvU

注:此为本人在博客园的处女作,希望大家多顶几下,以示鼓励!

借网上盛传2000w记录介绍多进程处理的更多相关文章

  1. 从头开始编写一个Orchard网上商店模块(1) - 介绍

    原文地址:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-par ...

  2. Log4Net日志记录介绍

    原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft . ...

  3. 执行maven install跳过执行maven test方法(网上搜的记录一下,方面以后使用)

    直接在pom文件加上这段配置就可以了 <plugin>           <groupId>org.apache.maven.plugins</groupId>  ...

  4. python记录_day30 多进程

    1.什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 同一个程序执行两次,就会产生两个进程 ## 进程调度算 ...

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

      ×   缘起---闲逛博客园 前几天的时候,在某一QQ群看到一条消息“XXX酒店开房XXXBTXX迅雷BT下载”,当时是一目十行的心态浏览,目光掠过时, 第一反应我想多了~以为是XX种子(你懂的~ ...

  6. SQLite介绍、学习笔记、性能测试

    SQLite介绍.学习笔记.性能测试 哪些人,哪些公司或软件在用SQLite: Nokia's Symbian,Mozilla,Abobe,Google,阿里旺旺,飞信,Chrome,FireFox可 ...

  7. Orchard网上商店模块

    从头开始编写一个Orchard网上商店模块(1) - 介绍 原文地址:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-w ...

  8. 数据同步canal服务端介绍

    1.下载安装包 canal&github的地址,最权威的学习canal相关知识的地方 https://github.com/alibaba/canal 在下面的wiki列表中找到AdminGu ...

  9. python的多线程和多进程(一)

    在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...

随机推荐

  1. python工具程序一、复制目录中指定扩展名的文件

    #!/usr/bin/env python # coding:utf-8 # xcopy Lib directory and rename all files to *d.lib import os ...

  2. O​r​a​c​l​e​1​1​g​ ​f​o​r​ ​R​e​d​H​a​t​6​.​4​安​装​手​册

    一. 检查 Oracle 11g 安装所依赖的软件包 检查包是否安装 # rpm -q 包名 包名: 1   ) binutils 2 ) compat-libstdc++   3) elfutils ...

  3. C++的64位整数

    在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...

  4. 为什么arcgis里,鼠标的图标都变成放大镜不能用了

    做作业做到一半,鼠标的图标就只有放大镜了,不管是点箭头还是作图工具都没用,手抓的也没用,只剩下放大镜的功能和图标了,这是怎么一回事啊?种情况我碰到过几次,具体原因不清楚,但是解决方法是有的:把你的数据 ...

  5. C#打开指定目录,并将焦点放在指定文件上。相对路径(程序起动的目录)

    string basepath = AppDomain.CurrentDomain.BaseDirectory; string filepath = "logs\\Log.log" ...

  6. 创建触发器在表中播入数据时ID自动增长

    ),age )) create or replace trigger gger_tt before insert on ttt for each row when (new.id is null) b ...

  7. linq检索带命名空间的xml

    XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...

  8. PHP学习笔记 - 进阶篇(10)

    PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...

  9. UIDynamic 基础认识

    UIDynamic 是从iOS 7开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如:碰撞.抖动.摆动等 动力效果:有一个效果器,叫做“动力效果器”里面面可以添加“动力效果” ...

  10. Easyui 加载树(easyui-tree)[dotnet]

    前台 html: <ul class="easyui-tree" id="ul_Tree" data-options="fit:true,ani ...