借网上盛传2000w记录介绍多进程处理

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

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

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

如今咱们将采用多进程对有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:数据库

public class Hotel2000WPartitioner extends SimplePartitioner {
    private String keyword = null;
    private String dir = null;
    private String[] filenames = null;
    public Hotel2000WPartitioner(String dir, String keywords) {
        this.dir = dir;
        this.filenames = findFilenames(new File(dir));
        this.keyword = keywords;
    }
    private static String[] findFilenames(File dir) {
        String[] filenames = dir.list(new FilenameFilter() {

            public boolean accept(File dir, String filename) {
                return filename.toUpperCase().endsWith("CSV");
            }
        });
        return filenames;
    }
    /**
     * 决定分为几个进程处理
     */
    @Override
    public int getTotalProcessor() {
        return filenames.length;
    }
    /**
     * 把参数传给Processor
     */
    @Override
    public Map<String, Object> processorParams(int index) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("filename", dir+File.separator+filenames[index]);
        params.put("keyword", keyword);
        return params;
    }
}

Processor:多线程

public class Hotel2000WProcessor extends AbsProcessor {
    /**
     * 读取文件并利用关键字搜索该文件
     */
    @Override
    public void doExecute() throws JvmProcessException {
        String keyword = getParams().get("keyword");
        String filename = getParams().get("filename");
        File f = new File(filename);

        BufferedReader dr = null;
        try {
            dr = new BufferedReader(new InputStreamReader(
                    new FileInputStream(f), "UTF-8"));
            while (dr.readLine() != null) {
                String line = dr.readLine();
                if(line!=null&&line.indexOf(keyword)!=-1) {
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(dr!=null)
                try {
                    dr.close();
                } catch (IOException e) {
                }
        }

    }
}

使用JVMPart工具运行:并发

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

 当程序运行时,咱们能够经过任务管理器看到有四个java进程在运行(其中一个为主进程).如图:jvm


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

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


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


注:此为本人在博客园的处女做,但愿你们多顶几下,以示鼓励!this

相关文章
相关标签/搜索